exponenta event banner

MISRA C:2012 Правило 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 дважды без перераспределения между ними.

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

Группа: Ресурсы
Категория: Обязательно
Категория СМЖЛ: обязательная
Представлен в R2015b