V2672. MISRA. Subtraction between pointers should only be applied to pointers that address elements of the same array.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Правило актуально только для С.
Вычитание указателей допускается только в том случае, если они оба указывают на элементы одного и того же массива или на элемент, следующий за последним элементом этого массива.
Если указатели принадлежат разным массивам или объектам, то поведение программы не определено (C11 пп. 6.5.6.9).
Рассмотрим пример:
void example(void)
{
int32_t a[10];
int32_t b[10];
int32_t *ptr1 = a;
int32_t *ptr2 = b + 10;
ptrdiff_t offset = ptr2 - ptr1; // <=
// ....
}
В коде вычисляется дистанция между началом первого массива и концом второго. Стандарт гарантирует адресную арифметику только для двух указателей, которые ссылаются на объект одного и того же массива. Поэтому поведение при такой адресной арифметике не определено.
Данная диагностика классифицируется как:
|