﻿# V2672\. MISRA\. Subtraction between pointers should only be applied to pointers that address elements of the same array\.

Диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Правило актуально только для С\.

Вычитание указателей допускается только в том случае, если они оба указывают на элементы одного и того же массива или на элемент, следующий за последним элементом этого массива\.

Если указатели принадлежат разным массивам или объектам, то поведение программы не определено \(C11 пп\. [6\.5\.6\.9](https://open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf#page=92)\)\.

Рассмотрим пример:

```cpp
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; // <=
  // ....
}
```

В коде вычисляется дистанция между началом первого массива и концом второго\. Стандарт гарантирует адресную арифметику только для двух указателей, которые ссылаются на объект одного и того же массива\. Поэтому поведение при такой адресной арифметике не определено\.