Массивы в стиле C не должны использоваться
Массивы в стиле C не должны использоваться.
Массив в стиле C - это массив, не заключенный в класс, такой как std::array при объявлении массива. Можно потерять информацию о размере массива в стиле C. Например, массив, передаваемый функции, распадается на указатель на первый элемент массива. Это может привести к небезопасному и трудному ведению кода.
Стандарт AUTOSAR допускает объявление static constexpr элементы данных типа массива C-style. Например, это объявление соответствует требованиям.
class A
{
public:
static constexpr std::uint8_t array[] {0, 1, 2}; // Compliant by exception
}; |
Средство проверки правил не помечает аргументы массива в стиле C в объявлениях функций, поскольку нарушение правила все еще существует, если исправить объявление функции, а не определение. Функция может быть объявлена в коде и определена в библиотеке, доступ к которой невозможен. Средство проверки помечает аргументы массива в стиле 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 Библиотека языковой поддержки |
| Категория: Обязательно, Автоматизировано |