Использование ранее закрытого ресурса

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

Описание

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

Риск

Стандарт утверждает, что значение указателя 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