Массивы в стиле 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
}; |
Проверка правил не помечает аргументы массива 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 даже если для аргумента нет явного определения массива в стиле С. Для примера объявления char* value; вместо char value[10]; в baz() все еще привести к нарушению правил в отношении аргумента foo.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: 18 Language Support Library |
| Категория: Необходимый, Автоматизированный |