Правило 21.3 MISRA C:2012

Функции выделения памяти и освобождения <stdlib.h> не должны использоваться

Описание

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

Функции выделения памяти и освобождения <stdlib.h> не должны использоваться.

Объяснение

Используя выделение памяти и освобождение стандартные программы могут вызвать неопределенное поведение. Например:

  • Вы освобождаете память это, вы не выделили динамически.

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

Реализация Polyspace

Если вы используете имена динамических функций выделения памяти кучи для макросов, и вы расширяете макросы в коде, это правило нарушено. Это принято, что правило 21.2 не нарушено.

Обменивайтесь сообщениями в отчете

  • Макрос <имя> не должен использоваться.

  • Идентификатор XX не должен использоваться.

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

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

Примеры

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

#include <stdlib.h>

static int foo(void);

typedef struct struct_1 {
    int a;
    char c;
} S_1;

static int foo(void) {

    _S_1 * ad_1;
    int  * ad_2;
    int  * ad_3;

    ad_1 = (S_1*)calloc(100U, sizeof(S_1));        /* Non-compliant */
    ad_2 = malloc(100U * sizeof(int));             /* Non-compliant */
    ad_3 = realloc(ad_3, 60U * sizeof(long));      /* Non-compliant */

    free(ad_1);                                    /* Non-compliant */
    free(ad_2);                                    /* Non-compliant */
    free(ad_3);                                    /* Non-compliant */

    return 1;
}

В этом примере нарушено правило, когда функции malloc, calloc, realloc и free используются.

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

Группа: стандартные библиотеки
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2014b