メインコンテンツ

MISRA C:2023 Rule 11.9

The macro NULL shall be the only permitted form of integer null pointer constant

R2024a 以降

説明

ルール定義

The macro NULL shall be the only permitted form of integer null pointer constant 1 .

根拠

以下の式では null ポインター定数を使用できます。

  • ポインターへの代入

  • == または != 演算で、一方のオペランドがポインターである

  • ?: 演算で、: のいずれかの側のオペランドがポインターである

0 ではなく NULL を使用すると null ポインター定数の使用を意図しているのが明確になります。

Polyspace 実装

チェッカーは、ポインターへの定数 0 の代入、ポインターを定数 0 と比較する等式 (または不等式)、および MISRA C™:2012 のドキュメンテーションで一覧されている他の同様の式にフラグを設定します。

MISRA C:2012 Technical Corrigendum 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
}

MISRA C:2012 Technical Corrigendum 1 での更新以降、チェッカーは次のようなポインターのみを含む集合体を初期化するための {0} の使用を許容するようになっています。

  • ポインターの配列 (例: myArray)

  • 1 つのポインター フィールドのみが含まれる構造体 (例: structPtr)

集合体に複数のフィールドが含まれる場合 (StructIntPtr など) は、引き続き初期化にフラグが設定されます。この場合、ポインター フィールドにはマクロ NULL、整数フィールドには 0 を使用して、フィールドを区別してください。

チェック情報

グループ: Pointer Type Conversions
カテゴリ: 必要
AGC カテゴリ: Readability

バージョン履歴

R2024a で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.