exponenta event banner

MISRA C:2012 Правило 11.9

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

Описание

Определение правила

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

Объяснение

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

  • Назначение указателю

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

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

Используя NULL вместо «0» ясно, что предназначалась константа нулевого указателя.

Внедрение Polyspace

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

После обновления в техническом исправлении 1 MISRA C: 2012 средство проверки позволяет использовать {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
}

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

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

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

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

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

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