Описание
Плохой режим доступа к файлу или состояние происходят, когда вы используете функции в fopen или группе open с недопустимыми или несовместимыми режимами доступа к файлу, флагами создания файла или флагами состояния файла в качестве аргументов. Например, для функции open, примеров допустимых:
Режимы доступа включают O_RDONLY, O_WRONLY и O_RDWR
Флаги создания файла включают O_CREAT, O_EXCL, O_NOCTTY и O_TRUNC.
Флаги состояния файла включают O_APPEND, O_ASYNC, O_CLOEXEC, O_DIRECT, O_DIRECTORY, O_LARGEFILE, O_NOATIME, O_NOFOLLOW, O_NONBLOCK, O_NDELAY, O_SHLOCK, O_EXLOCK, O_FSYNC, O_SYNC и так далее.
Дефект может произойти в следующих ситуациях.
| Ситуация | Риск | Фиксация |
|---|
Вы передаете пустой или недопустимый режим доступа функции fopen. Согласно стандарту ANSI® C, допустимые режимы доступа для fopen:
r, r+
w, w+
a, a+
rb, wb, ab
r+b, w+b, a+b
rb+, wb+, ab+
| fopen имеет неопределенное поведение для недопустимых режимов доступа.
Некоторые реализации позволяют расширение режима доступа, такого как:
Однако ваша строка режима доступа должна начаться с одной из допустимых последовательностей. | Передайте допустимый режим доступа fopen. |
Вы передаете флаг O_APPEND состояния функции open, не комбинируя его или с O_WRONLY или с O_RDWR. | O_APPEND указывает, что вы намереваетесь добавить новое содержимое в конце файла. Однако без O_WRONLY или O_RDWR, вы не можете записать в файл.
Функция open не возвращается-1 для этой логической ошибки. | Передайте или O_APPEND|O_WRONLY или O_APPEND|O_RDWR как режим доступа. |
Вы передаете флаги состояния O_APPEND и O_TRUNC вместе к функции open. | O_APPEND указывает, что вы намереваетесь добавить новое содержимое в конце файла. Однако O_TRUNC указывает, что вы намереваетесь обрезать файл, чтобы обнулить. Поэтому эти два режима не могут действовать вместе. Функция open не возвращается-1 для этой логической ошибки. | В зависимости от того, что вы намереваетесь сделать, передайте один из этих двух режимов. |
Вы передаете флаг O_ASYNC состояния функции open. | На определенных реализациях режим O_ASYNC не включает управляемые сигналом операции I/O. | Используйте fcntl(pathname, F_SETFL, O_ASYNC); вместо этого. |
Фиксация
Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.
Смотрите примеры мер ниже.
Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.
Пример - недопустимый режим доступа с fopen
#include <stdio.h>
void func(void) {
FILE *file = fopen("data.txt", "rw");
if(file!=NULL) {
fputs("new data",file);
fclose(file);
}
}В этом примере режим доступа rw недопустим. Поскольку r указывает, что вы открываете файл для чтения, и w указывает, что вы создаете новый файл для записи, эти два режима доступа несовместимы.
Исправление — использует или r или w как режим доступа
Одно возможное исправление должно использовать соответствие режима доступа, что вы намереваетесь сделать.
#include <stdio.h>
void func(void) {
FILE *file = fopen("data.txt", "w");
if(file!=NULL) {
fputs("new data",file);
fclose(file);
}
}