exponenta event banner

Закрытие ранее закрытого ресурса

Функция закрывает ранее закрытый поток

Описание

Этот дефект возникает, когда функция пытается закрыть поток, который был закрыт ранее в коде и не был открыт позже.

Риск

Стандарт утверждает, что значение FILE* после закрытия связанного с ним потока указатель становится неопределенным. Выполнение операции закрытия на FILE* указатель снова может вызвать нежелательное поведение.

Зафиксировать

Снимите операцию закрытия с резервированием.

Примеры

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

#include <stdio.h>

void func(char* data) {
    FILE* fp = fopen("file.txt", "w");
    if(fp!=NULL) {
        if(data)
            fputc(*data,fp);
        else
            fclose(fp);
    }
    fclose(fp);
}

В этом примере, если fp не является NULL и data является NULL, fclose операция происходит на fp дважды подряд.

Коррекция - удалить операцию закрытия

Одной из возможных корректировок является удаление последнего fclose операция. Чтобы избежать утечки ресурсов, необходимо также разместить fclose операции в if(data) блок.

#include <stdio.h>

void func(char* data) {
    FILE* fp = fopen("file.txt", "w");
    if(fp!=NULL) {
        if(data) {
            fputc(*data,fp);
            fclose(fp);
        }
        else
            fclose(fp);
    }
}

Информация о результатах

Группа: Управление ресурсами
Язык: C | C++
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: DOUBLE_RESOURCE_CLOSE
Воздействие: Высокое
CWE ID: 672, 826, 910
Представлен в R2015b