このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
MISRA C++:2023 Rule 11.3.2
The declaration of an object should contain no more than two levels of pointer indirection
R2024b 以降
説明
ルール定義
The declaration of an object should contain no more than two levels of pointer indirection. 1
根拠
2 レベルを超えるポインター間接参照を使用すると、コードを読む開発者にとって、コードの動作を理解するのが難しくなる場合があります。
Polyspace 実装
Polyspace® は、2 レベルを超えるポインター間接参照が含まれるオブジェクトの宣言のすべてにフラグを設定します。
型のエイリアスを使用すると、チェッカーは間接参照のレベルを評価する際に、エイリアスからのポインター間接参照も考慮します。たとえば、このコード スニペットでは、
var
の宣言がルールに準拠していません。var
の型はconst
ポインターであり、このポインターはconst
ポインターを指し、そのポインターはchar
を指すため、ポインター間接参照は 3 レベルとなります。var2
の宣言では 2 レベルのポインター間接参照を使用しているため、ルールに準拠しています。using ptrToChar = char*; void func() { ptrToChar* const* const var = nullptr; //Non-compliant, 3 levels of indirection char* const* const var2 = nullptr; //Compliant, 2 levels of indirection //... }
配列を関数に渡す場合、間接参照のレベルの評価で、最初の配列要素を指すポインターへの配列の変換が考慮されます。たとえば、このコード スニペットでは、パラメーター
arrParam
がルールに準拠していません。arrParam
の型は、別の 2 つのポインターを介してchar
を指すポインターです (3 レベルのポインター間接参照)。arrVar
の配列の型は、別の 1 つのポインターを介して char を指すポインターであるため (2 レベルのポインター間接参照)、arrVar
の宣言はルールに準拠しています。void func(char** arrParam[]) //Non-compliant { //... char** arrVar[5]; //Compliant }
このチェッカーは、2 レベルを超える間接参照を含むオブジェクトの "使用" に対してフラグを設定しません。たとえば、このコード スニペットでは、var
の宣言はルールに準拠していませんが、var
のサイズの評価はルールに準拠しています。
#include<iostream> using charToPtr = char*; void func() { charToPtr* const* const var = nullptr; //Non-compliant std::cout << sizeof(var) << std::endl; //Compliant }
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
チェック情報
グループ: Declarators |
カテゴリ: 推奨 |
バージョン履歴
R2024b で導入
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.