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

Все средства, полученные динамически посредством Стандартных Библиотечных функций, должны быть явным образом высвобождены

Описание

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

Все средства, полученные динамически посредством Стандартных Библиотечных функций, должны быть явным образом высвобождены.

Объяснение

Ресурсы - что-то, что необходимо возвратить в систему, если вы использовали их. Примеры включают динамически выделенную память и дескрипторы файлов.

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

Реализация Polyspace

Можно проверять на это правило с анализом Средства поиска Ошибки только.

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

Все средства, полученные динамически посредством Стандартных Библиотечных функций, должны быть явным образом высвобождены.

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

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

Примеры

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

#include<stdlib.h>


void performOperation(int);

int func1(int num) {
    int *arr1 = (int*) malloc(num * sizeof(int));
    
    return 0;
}            /* Non-compliant - memory allocated to arr1 is not released */

int func2(int num) {
    int *arr2 = (int*) malloc(num * sizeof(int));
    
    free(arr2);
    return 0;
}           /* Compliant - memory allocated to arr2 is released */

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

#include <stdio.h>
void func1( void ) {
    FILE *fp1;
    fp1 = fopen ( "data1.txt", "w" );
    fprintf ( fp1, "*" );

    fp1 = fopen ( "data2.txt", "w" );              /* Non-compliant */
    fprintf ( fp1, "!" );
    fclose ( fp1 );
}

void func2( void ) {
    FILE *fp2;
    fp2 = fopen ( "data1.txt", "w" );
    fprintf ( fp2, "*" );
    fclose(fp2);

    fp2 = fopen ( "data2.txt", "w" );              /* Compliant */
    fprintf ( fp2, "!" );
    fclose ( fp2 );
}

В этом примере указатель файла fp1 указывает на файл data1.txt. Прежде чем fp1 явным образом отделен от потока файла data1.txt, это используется, чтобы получить доступ к другому файлу data2.txt. Поэтому правило 22.1 нарушено.

Правило не нарушено в func2, потому что файл, data1.txt закрывается и указатель файла fp2, явным образом отделен от data1.txt, прежде чем это будет снова использовано.

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

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

Введенный в R2015b