exponenta event banner

MISRA C:2012 Правило 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 указывает на различные массивы.

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

Группа: указатели и массивы
Категория: Обязательно
Категория СМЖЛ: требуется