C and C++


LANG.TYPE.BCVNID : 菱形継承階層構造外の仮想基底クラス

要旨

該当する基底クラスは仮想基底クラスとして宣言されますが、一般的な菱形(ダイヤモンド)継承階層構造における仮想基底クラスではありません。

このワーニングクラスは、 Virtual Base Classの厳格なスーパーセットとなります。

プロパティ

クラス名 Virtual Base Class not In Diamond
日本語クラス名 菱形継承階層構造外の仮想基底クラス
クラス分類 スタイル (style)
ニーモニック LANG.TYPE.BCVNID
カテゴリー
AUTOSARC++14 AUTOSARC++14:M10-1-1 Classes should not be derived from virtual bases.
  AUTOSARC++14:M10-1-2 A base class shall only be declared virtual if it is used in a diamond hierarchy.
MisraC++2008 MisraC++2008:10-1-1 Classes should not be derived from virtual bases.
  MisraC++2008:10-1-2 A base class shall only be declared virtual if it is used in a diamond hierarchy.
MisraC++2023 MisraC++2023:13.1.1 Classes should not be inherited virtually
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっており、プロジェクトには非正規の C向けAST が必要になります。有効にするにはプロジェクト設定ファイル (configuration file) に以下の WARNING_FILTER ルールと RETAIN_UNNORMALIZED_C_AST 設定を追加してください。
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Virtual Base Class not In Diamond"
注:非正規化された AST を継続して使用した場合、使用ディスク容量が増加し解析時間が長くなる可能性があります。

//        BaseA                  BaseB               BaseC  BaseD
//         / \                    |                   / \   /    
//        /   \                   |                  /   \ /     
//     Int1   Int2               Int3             Int4   Int5    
//        \   /                   |                  \   /       
//         \ /                    |                   \ /        
//      DerivedX               DerivedY             DerivedZ     

class BaseA {};
class BaseB {};
class BaseC {};
class BaseD {};

class Int1: public virtual BaseA {};                                   // ok:  within a diamond hierarchy
class Int2: public virtual BaseA {};                                   // ok:  within a diamond hierarchy
class Int3: public virtual BaseB {};                       // 'Virtual Base Class not In Diamond' warning issued here
class Int4: public virtual BaseC {};                                   // ok: within a diamond hierarchy
class Int5: public virtual BaseC, public virtual BaseD {}; // 'Virtual Base Class not In Diamond' warning issued here

class DerivedX: public Int1, public Int2 {};
class DerivedY: public Int3 {};
class DerivedZ: public Int4, public Int5 {};

もしVirtual Base Class の検出を有効化した場合、 Virtual Base Class のワーニングがサンプル内の それぞれの中間クラス宣言箇所 (Int1, Int2, Int3, Int4, Int5) で発行されます。

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。