exponenta event banner

MISRA C:2012 Правило 18.2

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

Описание

Определение правила

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

Объяснение

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

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

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#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 указывает на различные массивы.

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

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