Гибкий элемент массива, определенный с нулевым размером или единицей
Этот дефект возникает, когда для определения структуры с гибким элементом массива не используется стандартный синтаксис C.
С C99 можно определить гибкий элемент массива с неопределенным размером. Например, desc является гибким элементом массива в этом примере:
struct record {
size_t len;
double desc[];
};struct record {
size_t len;
double desc[0];
};При определении гибких элементов массива с использованием нулевого или нулевого размера реализация зависит от компилятора. Для компиляторов, не распознающих синтаксис, int массив размера один имеет буфер для одного int переменная. При попытке выполнить запись за пределы этого буфера могут возникнуть проблемы, связанные с доступом к массиву вне границ.
При использовании стандартного синтаксиса C для определения гибкого элемента массива реализация переносится во все компиляторы, соответствующие стандарту.
Для реализации гибкого элемента массива в структуре определите массив неопределенного размера. Структура должна иметь один элемент помимо массива, и массив должен быть последним элементом структуры.
| Группа «Надлежащая практика» |
Язык: C (проверка отключена, если анализ выполняется по коду C90 указанному опцией-c-version c90) |
| По умолчанию: Откл. |
Синтаксис командной строки:
FLEXIBLE_ARRAY_MEMBER_INCORRECT_SIZE |
| Воздействие: Низкий |
Find defects (-checkers) | Hard-coded buffer size | Memory leak | Misuse of structure with flexible array member | Pointer access out of bounds | Unprotected dynamic memory allocation