﻿# V2559\. MISRA\. Subtraction, \>, \>\=, <, <\= should be applied only to pointers that address elements of the same array\.

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

Согласно стандарту C/C\+\+ \(C11 § 6\.5\.8 п\. 5; C\+\+17 § 8\.5\.9 п\. 3\) применение одного из операторов '\-', '\>', '\>\=', '<' или '<\=' к двум указателям, которые не указывают на элементы одного и того же массива, приводит к неопределенному/неуточненному поведению \(undefined/unspecified behaviour\)\. Таким образом, если два указателя указывают на разные объекты массива, тогда эти объекты массива должны входить в один и тот же массив для того, чтобы сравнить их\. 

Пример кода, на который анализатор выдаст предупреждение:

```cpp
int arr1[10];
int arr2[10];
int *pArr1 = arr1;
if (pArr1 < arr2)
{
  ....
}
```

Также следующий код является ошибочным:

```cpp
int arr1[10];
int arr2[10];
int *pArr1 = &arr1[1];
int *pArr2 = &arr2[1];
int len = pArr1 - pArr2;
```

Подробнее о том, почему использование указателей может привести к ошибке можно прочитать в статье: "[Указатели в C абстрактнее, чем может показаться](https://pvs-studio.ru/ru/blog/posts/cpp/0576/)"\.