Массивы C-стиля не должны использоваться
Массивы C-стиля не должны использоваться.
Массив C-стиля является массивом, который не перенесен в класс, такой как std::array
когда массив объявляется. Можно потерять информацию о размере массива C-стиля. Например, массив, который вы передаете функции, затухает к указателю на первый элемент массива. Это может привести к небезопасному и трудному, чтобы обеспечить код.
Стандарт AUTOSAR позволяет объявления static constexpr
элементы данных типа массива C-стиля. Например, это объявление совместимо.
class A { public: static constexpr std::uint8_t array[] {0, 1, 2}; // Compliant by exception }; |
Средство проверки правила не отмечает аргументы Array C-стиля в объявлениях функции, потому что нарушение правила все еще существует, если вы фиксируете объявление функции а не определение. Функциональная сила быть объявленным в вашем коде и заданным в библиотеке, к которой вы не можете получить доступ. Средство проверки отмечает аргументы Array C-стиля в функциональных определениях. Например, в этом фрагменте кода, средство проверки отмечает аргумент foo
но не аргумент bar
.
extern void bar(char arg[]); //Declaration, checker raises no rule violation int foo(char arg[]) // Definition, checker raises a rule violation { return sizeof(arg); //Returns size of pointer, not size of array } void baz() { char value[10]; //C-style array, checker raises a rule violation assert(sizeof(value) == foo(value)); } |
Средство проверки повышает флаг на arg
в определении foo
даже когда нет никакого явного определения C-стиля массивов для аргумента. Например, объявление char* value;
вместо char value[10];
в baz()
все еще привел бы к нарушению правила на аргументе foo
.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: 18 вспомогательных библиотек языка |
Категория: необходимый, автоматизированный |