MISRA C:2012 Rule 22.2

Блок памяти освобождается только в том случае, если он был выделен с помощью функции Standard Library

Описание

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

Блок памяти освобождается только в том случае, если он был выделен с помощью функции Standard Library.

Объяснение

Стандартные функции библиотеки, которые выделяют память 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