exponenta event banner

ISO/IEC TS 17961 [xfree]

Перераспределение или освобождение памяти, которая не была динамически выделена

Описание

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

Перераспределение или освобождение памяти, которая не была динамически выделена. [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); 
}

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

Разрешимость: неразрешимая
Представлен в R2019a

[1] Выдержки из стандарта «ISO/IEC TS 17961 Technical Specification - 2013-11-15» воспроизводятся с согласия AFNOR. Нормативную ценность имеет только оригинальный и полный текст стандарта, опубликованный изданиями AFNOR - доступный через веб-сайт www.boutique.afnor.org.