exponenta event banner

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

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

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