MISRA C:2012 Rule 18.2

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

Описание

Управляйте определением

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

Объяснение

Это правило применяется к выражениям формы pointer_expression1 - pointer_expression2. Поведение не определено если pointer_expression1 и pointer_expression2:

  • Не указывайте на элементы того же массива,

  • Или не указывайте на элемент один вне конца массива.

Реализация Polyspace

Это правило повышено каждый раз, когда анализ обнаруживает Subtraction or comparison between pointers to different arrays.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#include <stddef.h>
#include <stdint.h>

void f1 (int32_t *ptr)
{
    int32_t a1[10];
    int32_t a2[10];
    int32_t *p1 = &a1[ 1];
    int32_t *p2 = &a2[10];
    ptrdiff_t diff1, diff2, diff3;

    diff1 =  p1 - a1;   // Compliant
    diff2 =  p2 - a2;   // Compliant
    diff3 =  p1 - p2;   // Non-compliant
}

В этом примере три выражения вычитания показывают различие между совместимыми и несовместимыми вычитаниями указателя. diff1 и diff2 вычитания совместимы, потому что указатели указывают на тот же массив. diff3 вычитание несовместимо потому что p1 и p2 укажите на различные массивы.

Проверяйте информацию

Группа: указатели и массивы
Категория: необходимый
Категория AGC: необходимый