メインコンテンツ

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

MISRA C++:2008 Rule 12-1-1

An object's dynamic type shall not be used from the body of its constructor or destructor.

説明

ルール定義

An object's dynamic type shall not be used from the body of its constructor or destructor.

根拠

オブジェクトの動的な型は、その最上位の派生クラスの型です。次に例を示します。

struct B { 
	virtual ~B() {}
}; 
struct D: B {}; 
D d; 
B* ptr = &d;
*ptr が指すオブジェクトの動的な型は D です。これは、ポリモーフィック階層の最上位の派生クラスであるためです。

ポリモーフィック オブジェクトの動的な型をそのコンストラクターまたはデストラクターで呼び出すと、最上位の派生オブジェクトの型ではなく、構築または破棄されたオブジェクトの型を取得する可能性があります。これは、構築中または破棄中に動的な型を呼び出す時点で、派生クラスがまだ構築されていない可能性があるためです。コンストラクターおよびデストラクターで動的な型を使用すると、予期しない動作が発生する可能性があります。コンストラクターおよびデストラクターからの純粋なバーチャル関数を呼び出すと、未定義の動作が発生します。オブジェクトのコンストラクターまたはデストラクターで、そのオブジェクトの動的な型を使用することを回避します。

Polyspace 実装

Polyspace® は、ポリモーフィック クラスのコンストラクターまたはデストラクターで以下の項目が使用されている場合に、これらの項目にフラグを設定します。

  • typeid 演算子

  • バーチャル関数または純粋なバーチャル関数

  • 関数 dynamic_cast または暗黙的な C スタイルのキャスト

Polyspace では、バーチャル メンバーを持つクラスはポリモーフィックであると想定されます。

トラブルシューティング

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

すべて展開する

#include <cassert>
#include <typeinfo>

class PS
{
public:
	PS ( )
	{
		typeid ( PS );                // Compliant
	}
};

class PS_1
{
public:
	virtual ~PS_1 ( );
	virtual void bar ( );
	PS_1 ( )
	{
		typeid ( PS_1 );                // Noncompliant                   
		PS_1::bar ( );                  // Compliant 
		bar ( );                      // Noncompliant                   
		dynamic_cast< PS_1* > ( this ); // Noncompliant                   
	}
};

この例では、クラス PS にはバーチャル メンバーがありません。Polyspace は PS をポリモーフィック クラスと見なしません。PS がポリモーフィックではないため、その動的な型は実行時に変更されません。Polyspace は、コンストラクター PS::PS() での typeid 演算子の使用にフラグを設定しません。

PS_1 にはメンバー関数 virtual が含まれているため、ポリモーフィックと見なされます。ポリモーフィックであるため、実行時にその動的な型が変更されます。Polyspace は、コンストラクター PS_1::PS_1() でのその動的な型の呼び出しにフラグを設定します。

チェック情報

グループ: Special Member Functions
カテゴリ: 必要

バージョン履歴

R2013b で導入