メインコンテンツ

AUTOSAR C++14 Rule A5-2-1

dynamic_cast should not be used

説明

ルール定義

dynamic_cast should not be used.

根拠

dynamic_cast は、クラスへのポインターまたは参照の型を、継承階層に沿って変換するために使用します。たとえば、基底クラスへのポインターを派生クラスへのポインターに変換します。この変換では、実行時に実施される型チェックによるオーバーヘッドが発生します。このオーバーヘッドは、リアルタイム システムの低いメモリ要件、速度要件、および予測可能なパフォーマンス要件に適合しません。

アプリケーションで動的キャストを回避できない場合は、カスタム実装を使用したキャスト実行を検討してください。最上位の派生クラス、または関数とテンプレートがオーバーロードしている静的多態性にキャストする場合は、バーチャル関数の使用も検討してください。後者の場合は、型がコンパイル時に解決され、オーバーヘッドが回避されます。

Polyspace 実装

Polyspace® は、コード内の dynamic_cast のすべての使用にフラグを設定します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include<iostream>


using namespace std;

class Base
{
public:
    virtual void f()
    {
        cout << "Using Base class\n";
    }
};

class Derived1 : public Base
{
public:
    virtual void f()
    {
        cout << "Using Derived class\n";
    }
};

class Derived2 : public Derived1
{
public:
    virtual void f()
    {
        cout << "Using Derived2 class\n";
    }
};


int main()
{
    Derived2* ptrd2 = new Derived2;

    Derived1* ptrd1 = dynamic_cast<Derived1*>(ptrd2); // Noncompliant
    ptrd1 -> f();

    Base* ptrb = dynamic_cast<Base*>(ptrd2); // Noncompliant
    ptrb -> f();
}

この例では、BaseDerived1 が、それぞれ Derived2 の間接基底クラスと直接基底クラスです。dynamic_cast を使用して、ptrd2Derived2 型から Derived1 型にアップキャストしてから、Base 型にアップキャストすることはルールに準拠していません。この場合は、暗黙的な変換 (Derived1 * ptr = ptrd2;) を介してアップキャストを実行できるため、dynamic_cast を使用する必要はありません。

チェック情報

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

バージョン履歴

R2020b で導入