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: Требуется