MISRA C:2012 Rule 11.9

Макро-NULL должен быть единственной разрешенной формой целочисленного постоянного нулевого указателя

Описание

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

Макро-NULL должен быть единственной разрешенной формой целочисленного постоянного нулевого указателя.

Объяснение

Следующие выражения позволяют использование постоянного нулевого указателя:

  • Присвоение на указатель

  • == или != операция, где один операнд является указателем

  • ?: операция, где один из операндов по обе стороны от: указатель

Используя NULL вместо 0 проясняет, что был предназначен постоянный нулевой указатель.

Реализация Polyspace

Средство проверки отмечает присвоение постоянного нуля к указателям, равенства (или неравенства) сравнение указателей с постоянным нулем и других подобных выражений, перечисленных в MISRA C®: 2 012 документации.

После обновлений в MISRA C: 2 012 Технических Исправлений 1, средство проверки позволяет использованию {0} инициализировать, агрегируется содержащий только указатели, например, массивы указателей или структур (или объединения) только с полем указателя. Если агрегат содержит несколько полей, инициализация все еще отмечается. В этих случаях необходимо использовать макро-NULL для полей указателя и 0 для целочисленных полей, чтобы различать их.

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

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

Примеры

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

void main(void) {

    int *p1 = 0;              /* Non-compliant */ 
    int *p2 = ( void * ) 0;   /* Compliant     */ 

#define MY_NULL_1 0    /* Non-compliant */
#define MY_NULL_2 ( void * ) 0  

    if ( p1 == MY_NULL_1 )
    { }
    if ( p2 == MY_NULL_2 )    /* Compliant     */
    { }

}

В этом примере нарушено правило, когда постоянный 0 используется вместо (void*) 0 для присвоений указателя и сравнений.

void init () {
    int *myArray[5] = {0}; //Compliant

    struct structPtr { 
        int *ptr;
    } structPtr = {0}; //Compliant

    struct StructIntPtr { 
        int data;
        int *ptr;
    } StructIntPtr = {0,0}; //Non-compliant
}

После обновлений в MISRA C: 2 012 Технических Исправлений 1, средство проверки позволяет использованию {0} инициализировать, агрегируется содержащий только указатели, такие как:

  • Массивы указателей, например, myArray

  • Структуры с одним полем указателя только, например, structPtr

Если агрегат содержит несколько полей, таких как StructIntPtr, инициализация все еще отмечается. В этих случаях необходимо использовать макро-NULL для полей указателя и 0 для целочисленных полей, чтобы различать их.

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

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