exponenta event banner

CERT C: MEM34-C правил

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

Описание

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

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

Внедрение Polyspace

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

Примеры

развернуть все

Проблема

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

Риск

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); 
}

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

Группа: Правило 08. Управление памятью (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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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