exponenta event banner

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 используются.

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

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