MISRA C++:2008 Rule 5-0-19
The declaration of objects shall contain no more than two levels of pointer indirection.
説明
ルール定義
The declaration of objects shall 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 から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
チェック情報
| グループ: Expressions |
| カテゴリ: 必要 |
バージョン履歴
R2013b で導入
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.