メインコンテンツ

AUTOSAR C++14 Rule M10-2-1

All accessible entity names within a multiple inheritance hierarchy should be unique.

説明

ルール定義

All accessible entity names within a multiple inheritance hierarchy should be unique.

根拠

同じ継承階層内に同名のデータ メンバーと非バーチャル関数があると、開発者の混乱を招くおそれがあります。開発者が使用する予定のエンティティが、コンパイラにより選択されるエンティティではない可能性があります。多重継承階層内でアクセス可能なエンティティに一意でない名前を使用することを回避します。

Polyspace 実装

このチェッカーは、同一の派生クラスに属する個々のクラスのエンティティの名前があいまいな場合に、これらのエンティティにフラグを設定します。次の場合にエンティティの名前があいまいになります。

  • 2 つの変数が、型が異なる場合でも同じ名前を共有している。

  • 2 つの関数が同じ名前、同じパラメーター、同じ戻り値の型を共有している。

派生クラス内でアクセスされるデータ メンバーがあいまいな場合、Polyspace® はこの問題をコーディング ルール違反ではなくコンパイルの問題として報告します。チェッカーは、メンバー関数とデータ メンバーなど、異なる種類のエンティティ間における競合をチェックしません。

トラブルシューティング

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

すべて展開する

#include <iostream>
#include <cstdlib>
#include <cstdint>

using namespace std;

class A {
  public:
    int32_t num;               
    int32_t total;             
    int32_t sum(int32_t toSum) 
    {
        total = toSum + num;
        return total;
    };
};

class B {
  public:
    int32_t num;   //Also in class A
    int32_t total();           
    int32_t sum(int32_t toSum)   //Also in class A
    {
        num = toSum + num;
        return num;
    };
};


class C : public A, public B { //Noncompliant
  public:
    void foo() {
        num = total;
        sum(num);
    }
};
  • class A および class B により独自のローカル変数 int32_t num が定義され、また class Cclass A および class B を含む多重継承階層であるため、Polyspace は両方の変数 int32_t num に対して非準拠としてフラグを設定します。

  • class Aint32_t sum()class Bint32_t sum() が、同じ名前、戻り値の型、引数を共有しており、同じ多重継承階層のメンバーであるため、Polyspace は両方の関数に対して非準拠としてフラグを設定します。

  • int32_t totalint_32t total() は異なるタイプのクラス メンバーであるため、Polyspace はこれらが同じ多重継承階層の一部であっても、フラグを設定しません。

あいまいなデータ メンバーはコンパイルの問題として報告されることがあります。

テンプレートによってコードが生成されるため、テンプレートから派生するクラス階層の名前は一意ではない可能性があります。この例では、クラス Deriv1 とクラス Deriv2 が、テンプレート myObj の 2 つの異なるインスタンスから派生します。その後、クラス FinalDerivedDeriv1Deriv2 の両方から派生します。テンプレート myObj から、FinalDerived クラス内の関数 get() の 2 つのバージョンが生成されます。1 つは myObj<int> インスタンスから、もう 1 つは myObj<short> インスタンスからです。一意ではない名前を使用すると、予期しない動作が発生する可能性があります。Polyspace が違反を報告します。

template <typename T>
class myObj {
	//...
public:
	void get(void);                       
};

class Deriv1: public myObj<int> {
public:
	//...                            
};

class Deriv2: public myObj<short> {
public:
	//...             
};

class FinalDerived: public Deriv1, public Deriv2 { //Noncompliant

public:
	//...
};

チェック情報

グループ: 派生クラス
カテゴリ: Advisory、Automated

バージョン履歴

R2019a で導入