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