Expressions and statements
ES.27
Используйте `std::array` или `stack_array` для массивов на стеке
Причина
Они читаемы и не преобразуются в указатели неявно. Их не путают с нестандартными расширениями встроенных массивов.
Пример (плохой)
const int n = 7;
int m = 9;
void f()
{
int a1[n];
int a2[m]; // ошибка: не стандартный C++
// ...
}
Примечание
Определение a1 является законным C++ и всегда таким было. Подобного кода много. Однако оно чревато ошибками, особенно когда граница нелокальна. Кроме того, это «популярный» источник ошибок (переполнение буфера, указатели от затухания массива и т.д.). Определение a2 допустимо в C, но не в C++ и считается угрозой безопасности.
Пример
const int n = 7;
int m = 9;
void f()
{
array<int, n> a1;
stack_array<int> a2(m);
// ...
}
Контроль
- Отмечайте массивы с неконстантными границами (массивы переменной длины в стиле C)
- Отмечайте массивы с нелокальными константными границами