Данное диагностическое правило основано на руководстве AUTOSAR (AUTomotive Open System ARchitecture) по разработке программного обеспечения.
Передача массива в функцию по указателю ведет к потери размера массива. В результате функция может принять в качестве аргумента массив с меньшим количеством элементов, чем ожидается, и в процессе выполнения выйти за его границы, что приведет к неопределенному поведению.
Чтобы избежать потери информации о размере массива, его стоит передавать только по ссылке. В случае, когда функция должна обрабатывать массивы разной длины, следует использовать класс для инкапсуляции массива и его размера.
Пример кода, не соответствующего правилу:
void foo(int *ptr); void bar(int arr[5]) void bar(const char chars[30]); int main { int array[5] = { 1, 2, 3 }; foo(array); bar(array); }
Допустимый вариант:
Void bar(int (&arr)[5]); int main { int array[7] = { 1, 2, 3, 4, 5 }; bar(array); }
Другой пример кода, несоответствующий правилу:
void bar(const char chars[30]); int main() { bar("something"); //const char[10] }
Допустимый вариант с использованием класса для инкапсуляции:
template <typename T> class ArrayView { T *m_ptr; size_t m_size; public: template <size_t N> ArrayView(T (&arr)[N]) noexcept: m_ptr(arr), m_size(N) {} // .... }; void bar(ArrayView<const char> arr); int main() { bar("something"); }
Данная диагностика классифицируется как:
|