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