MISRA C:2012 Rule 11.9

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

Описание

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

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

Объяснение

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

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

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

  • The ?: операция, где один из операндов с каждой стороны: является указателем

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

Реализация Polyspace

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

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

}

В этом примере правило нарушается, когда вместо (void*) 0 используется константа 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 для целочисленных полей, чтобы различать их.

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

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