exponenta event banner

MISRA C:2012 Правило 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 перед его повторным использованием.

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

Группа: Ресурсы
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2015b