MISRA C:2012 Dir 4.12

Динамическое выделение памяти не должно использоваться

Описание

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

Динамическое выделение памяти не должно использоваться.

Объяснение

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

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

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

  • Вы получаете доступ к выделенной памяти, которая не имеет никакого значения, сохраненного в него.

Динамическое выделение памяти и стандартные программы освобождения от сторонних библиотек, вероятно, предоставят подобное неопределенное поведение.

Если вы принимаете решение использовать стандартные программы динамического выделения памяти и освобождения, гарантировать, что ваше поведение программы предсказуемо. Например, гарантируйте, что вы безопасно обрабатываете отказ выделения из-за недостаточно памяти.

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

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

Примеры

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

#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: необходимый
Введенный в R2019b