# V3551. AUTOSAR. An identifier with array type passed as a function argument should not decay to a pointer.

Данное диагностическое правило основано на руководстве 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");
    }

Данная диагностика классифицируется как:

AUTOSAR-M5.2.12