exponenta event banner

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

Открытие уже открытого файла

Описание

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

Риск

При многократном открытии ресурса можно столкнуться с:

  • Условие гонки при доступе к файлу.

  • Неопределенное или непредвиденное поведение для этого файла.

  • Проблемы переносимости при запуске программы на разных объектах.

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

После открытия ресурса закройте его перед повторным открытием.

Примеры

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

#include <stdio.h>
const char* logfile = "my_file.log";

void doubleresourceopen()
{
    FILE* fpa = fopen(logfile, "w");
    if (fpa == NULL) {
        return;
    }
    (void)fprintf(fpa, "Writing");
    FILE* fpb = fopen(logfile, "r");
    (void)fclose(fpa);
    (void)fclose(fpb);
}

В этом примере logfile открывается в первой строке этой функции с правами записи. На полпути к функции logfile снова открывается с правами на чтение.

Исправление - Закрыть перед повторным открытием

Одним из возможных исправлений является закрытие файла перед его повторным открытием с различными привилегиями.

#include <stdio.h>
const char* logfile = "my_file.log";

void doubleresourceopen()
{
    FILE* fpa = fopen(logfile, "w");
    if (fpa == NULL) {
        return;
    }
    (void)fprintf(fpa, "Writing");
    (void)fclose(fpa);
    FILE* fpb = fopen(logfile, "r");
    (void)fclose(fpb);
}

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

Группа: Управление ресурсами
Язык: C | C++
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: DOUBLE_RESOURCE_OPEN
Воздействие: среднее
CWE ID: 362, 413, 675
Представлен в R2016b