MISRA C:2012 Rule 22.2

Блок памяти должен только быть освобожден, если это было выделено посредством Стандартной Библиотечной функции

Описание

Управляйте определением

Блок памяти должен только быть освобожден, если это было выделено посредством Стандартной Библиотечной функции.

Объяснение

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

Вы освобождаете блок от памяти, когда вы передаете ее адрес free или realloc функция. Следующие причины неопределенное поведение:

  • Вы освобождаете блок от памяти, которую вы не выделили.

  • Вы освобождаете блок от памяти, которые уже освободили прежде.

Реализация Polyspace

Можно проверять на это правило с анализом Bug Finder только.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#include <stdlib.h>

void func1(void) {
    int x=0;
    int *ptr=&x;

    free(ptr); /* Non-compliant: ptr is not dynamically allocated */
   
}

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

#include <stdlib.h>

void func(int arrSize) {
    int *ptr = (int*) malloc(arrSize* sizeof(int));
   
    free(ptr);   /* Block of memory freed once */
    free(ptr);   /* Non-compliant - Block of memory freed twice */
}

В этом примере правило нарушено когда free функция работает с ptr дважды без промежуточного перераспределения.

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

Группа: ресурсы
Категория: обязательный
Категория AGC: обязательный
Введенный в R2015b