メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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.