メインコンテンツ

AUTOSAR C++14 Rule A5-0-3

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.

根拠

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 から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

チェック情報

グループ:
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入