MISRA C:2012 Rule 22.1

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

Описание

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

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

Объяснение

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

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

Реализация Polyspace

Средство проверки отмечает использование:

  • Выделение памяти функционирует, такие как malloc и aligned_alloc если память не выпущена.

  • Открытие файла функционирует, такие как fopen если файл не закрывается.

Можно проверять на это правило с анализом Bug Finder только.

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

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

Примеры

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

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