MISRA C:2012 Rule 18.3

Операторы отношения>,> =, <и <= не должны быть применены к объектам типа указателя кроме того, где они указывают в тот же объект

Описание

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

Операторы отношения >, >=, <, и <= не буду применен к объектам типа указателя кроме того, где они указывают в тот же объект.

Объяснение

Если два указателя не указывают на тот же объект, сравнения между указателями производит неопределенное поведение.

Можно обратиться к элементу вне конца массива, но вы не можете получить доступ к этому элементу.

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

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

Примеры

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

void f1(void){
    int arr1[10];
    int arr2[10];
    int *ptr1 = arr1;

    if(ptr1 < arr2){}    /* Non-compliant */
    if(ptr1 < arr1){}    /* Compliant */
}

В этом примере, ptr1 указатель на arr1. Чтобы быть совместимыми с правилом 18.3, можно сравнить только ptr1 с arr1. Поэтому сравнение между ptr1 и arr2 несовместимо.

struct limits{
  int lower_bound;
  int upper_bound;
};

void func2(void){
    struct limits lim_1 = { 2, 5 };
    struct limits lim_2 = { 10, 5 };

    if(&lim_1.lower_bound <= &lim_2.upper_bound){}  /* Non-compliant *
    if(&lim_1.lower_bound <= &lim_1.upper_bound){}  /* Compliant */
}

Этот пример задает два limits структуры, lim1 и lim2, и сравнивает элементы. Чтобы быть совместимыми с правилом 18.3, можно сравнить только элементы структуры в структуре. Первое сравнение сравнивает lower_bound из lim1 и upper_bound из lim2. Это сравнение несовместимо потому что lim_1.lower_bound и lim_2.upper_bound элементы двух отличных структур.

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

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