メインコンテンツ

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

MISRA C++:2023 Rule 6.4.3

A name that is present in a dependent base shall not be resolved by unqualified lookup

R2024b 以降

説明

ルール定義

A name that is present in a dependent base shall not be resolved by unqualified lookup. 1

根拠

あるクラス テンプレートが別のクラス テンプレートから派生する場合、基底テンプレートと現在のスコープまたは名前空間の両方に存在する名前を使用することで、混乱が生じる可能性があります。基底クラス テンプレートとそれらのクラスが含まれる名前空間の両方に同じ名前が存在する場合、これらの名前のスコープ解決はコンパイラに依存するため、開発者の想定に反した結果になる可能性があります。このような名前の競合が発生した場合の混乱を避けるためには、完全修飾 ID または this-> を使用して明示的に意図するオブジェクトを示して曖昧さをなくします。

Polyspace 実装

Polyspace® は、次の条件がすべて当てはまる名前に対し、フラグを設定します。

  • 名前が基底クラスに存在する。

  • 名前が基底クラスを含む名前空間に存在する。

  • 修飾子付き ID または this-> を持たない名前が使用されている。

トラブルシューティング

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

すべて展開する

この例では、名前 Type および bar が、名前空間 NS0 とクラス テンプレート Base の両方に定義されています。クラス テンプレート DerivedBase から派生します。Derived::foo1() では、これらの名前が完全修飾名や this-> を使用せずに使われています。Base::foo1TYPENS0::TYPE または Base::TYPE のどちらに解決されるのかが明らかではありません。コンパイラの実装に応じて結果が異なる可能性があります。Polyspace は、これらの曖昧なステートメントにフラグを設定します。

Derived::foo2() では、TYPEbar がそれぞれの完全修飾名または this-> を使用して呼び出されています。完全修飾名または this-> を使用することで、スコープ解決における曖昧さが回避されます。Polyspace は、これらの使用にフラグを設定しません。

typedef signed   int          int32_t;
namespace NS0{
	typedef int32_t TYPE;

	void bar( );
	namespace NS1{
		namespace NS{
			
			template <typename T>
			class Base;
			template <typename T>
			class Derived : public Base<T>
			{
				void foo ( )
				{
					TYPE t = 0;                           // Noncompliant
					bar ( );                                // Noncompliant
				}
				void foo2 ( )
				{
					NS0::TYPE t1 = 0;                      // Compliant
					NS0::bar ( );                            // Compliant
					typename Base<T>::TYPE t2 = 0; // Compliant
					this->bar ( );                // Compliant
				}
			};
			template <typename T>
			class Base
			{
			public:
				typedef T TYPE;
				void bar ( );
			};
			template class Derived<int32_t>;
		}
	}
}

チェック情報

グループ: Basic Concepts
カテゴリ: Required

バージョン履歴

R2024b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.