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 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.