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
}

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

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

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