CERT C++: MEM34-C

Динамически выделяется только свободная память

Описание

Определение правила

Динамически выделяется только свободная память.[1]

Реализация Polyspace

Эта проверка проверяет недопустимость указателя без указателя.

Примеры

расширить все

Проблема

Недопустимое значение без указателя возникает, когда блок памяти, освобожденный с помощью free функция не была ранее выделена с помощью malloc, calloc, или realloc.

Риск

The free функция освобождает блок памяти, выделенный на куче. Если вы пытаетесь получить доступ к местоположению на куче, которую вы ранее не выделяли, может возникнуть отказ сегментации.

Проблема может выделить ошибки кодирования. Например, вы, возможно, хотели использовать free функция или предыдущий malloc функция на другом указателе.

Зафиксировать

В большинстве случаев можно исправить проблему, удалив free оператор. Если указателю не выделена память из кучы с malloc или calloc, вам не нужно освобождать указатель мыши. Вы можете просто повторно использовать указатель при необходимости.

Если проблема подсвечивает ошибку кодирования, такую как использование free или malloc на неправильном указателе исправьте ошибку.

Если проблема возникает из-за использования free функция для освобождения памяти, выделенной с помощью new оператор, замените free функция со delete оператор.

Пример - Недопустимая ошибка без указателя
#include <stdlib.h>

void Assign_Ones(void) 
{
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1; 
 
  free(p);   
  /* Defect: p does not point to dynamically allocated memory */
}

Указатель p отменяется с помощью free функция. Однако p указывает на место памяти, которое не было динамически выделено.

Коррекция - Удаление выделения указателя

Если количество элементов массива p известно во время компиляции, одна возможная коррекция состоит в том, чтобы удалить деаллокацию указателя p.

#include <stdlib.h>

void Assign_Ones(void)
 {
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1;   
  /* Fix: Remove deallocation of p */
 }
Коррекция - введение выделения указателя

Если количество элементов массива p не известно во время компиляции, одна возможная коррекция заключается в динамическом выделении памяти массиву p.

#include <stdlib.h>

void Assign_Ones(int num) 
{
  int *p;
  /* Fix: Allocate memory dynamically to p */
  p=(int*) calloc(10,sizeof(int)); 
  for(int i=0;i<10;i++)
     *(p+i)=1; 
  free(p); 
}

Проверяйте информацию

Группа: 06. Управление памятью (MEM)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.