exponenta event banner

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

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

Описание

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

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

Объяснение

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

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

  • Используется указатель, указывающий на свободное место памяти.

Внедрение Polyspace

Флаги проверки используют calloc, malloc, realloc, aligned_alloc и free функции.

Если определить макросы с теми же именами, что и эти функции распределения памяти динамической кучи, и развернуть макросы в коде, это правило нарушается. Предполагается, что правило 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 используются.

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

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