Opening previously opened resource

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

Описание

Этот дефект возникает, когда функция обработки файлов, такая как 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);
}

В этом примере a 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: DOUBLE_RESOURCE_OPEN
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 362, 413, 675
Введенный в R2016b