# V2563. MISRA. Array indexing should be the only form of pointer arithmetic and it should be applied only to objects defined as an array type.

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Данное правило актуально только для языка C++. Данное правило MISRA рекомендует не использовать адресную арифметику. Единственной формой адресной арифметики, допускаемой к использованию данным правилом, является операция индексирования ('[]'), применённая к сущности, объявленной как массив.

Исключение: допускается использовать инкремент и декремент ('++' и '--').

Использование адресной арифметики усложняет чтение программы и может являться причиной неправильного понимания написанного когда. С другой стороны, использование индексирования является явным и легко читаемым, и даже если при его использовании будет внесена ошибка, её будет легче обнаружить. То же касается и операций инкремента/декремента: они явно дают понять, что мы последовательно обходим область памяти, представляющую собой непрерывную область данных.

Пример нарушения правила:

    int arr[] = { 0, 1, 2 };
    int *p = arr + 1;        //+V2563
    p += 1;                  //+V2563
    int *q = p[1];           //+V2563

Корректный вариант кода:

    int arr[] = { 0, 1, 2 };
    int *p = &arr[1];
    ++p;

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

MISRA-CPP-2008-5.0.15