Use of previously closed resource

Функция работает с ранее закрытым потоком

Описание

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

Риск

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

Фиксация

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

Примеры

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

#include <stdio.h>

void func(void) {
    FILE *fp;
    void *ptr;

    fp = fopen("tmp","w");
    if(fp != NULL) {
        fclose(fp);
        fprintf(fp,"text");
    }
}

В этом примере, fclose закрывает поток, сопоставленный с fp. Когда вы используете fprintf на fp после fclose, дефект Use of previously closed resource появляется.

Коррекция — закрывает поток после всех операций

Одна возможная коррекция должна инвертировать порядок fprintf и fclose операции.

#include <stdio.h>

void func(void) {
    FILE *fp;
    void *ptr;

    fp = fopen("tmp","w");
    if(fp != NULL) {
        fprintf(fp,"text");
        fclose(fp);
    }
}

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

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

Введенный в R2015b