Closing a previously closed resource

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

Описание

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

Риск

Стандарт утверждает что значение 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 isNull, 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
Удар: высоко
ID CWE: 672, 826, 910

Введенный в R2015b