メインコンテンツ

AUTOSAR C++14 Rule A2-10-4

The identifier name of a non-member object with static storage duration or static function shall not be reused within a namespace

説明

ルール定義

The identifier name of a non-member object with static storage duration or static function shall not be reused within a namespace.

根拠

名前空間を使用して、それぞれの名前空間内で宣言する識別子のスコープを絞り込みます。これにより、あるスコープ内の識別子が別のスコープ内の同一の識別子と間違われなくなります。同じ名前空間内の静的ストレージ存続期間が設定された識別子を複数のソース ファイルで再利用すると、識別子を区別できなくなる可能性があります。

Polyspace 実装

  • 識別子を再利用すると、Polyspace® が、同じ翻訳単位内にある識別子の最後の使用にフラグを設定します。識別子が異なるファイルに入っている場合は、アルファベット順で最後のファイル パス内の識別子にフラグが設定されます。

    ただし、識別子を再利用しても、その識別子の 1 つのインスタンスのみをキーワード static を使用して宣言すると、識別子が宣言される順序に関係なく、その宣言された識別子にフラグが設定されます。

  • ある名前空間内で一つの識別子を宣言し、その識別子を同じ名前空間内で再使用したとしても、それが入れ子になった名前空間内またはインライン化された名前空間内である場合には Polyspace は違反を報告しません。たとえばこのコード スニペットでは、reusedVar に対して違反は報告されません。

    //file1.cpp
    namespace foo {
      static int reusedVar; //resuedVar has static storage duration
    }
    
    //file2.cpp
     namespace foo {
      void func();
      namespace nested_foo { 
        float reusedVar;
      }
      inline namespace inlined_foo {
        char reusedVar;
      }
    }
        

このチェッカーは、次のような未使用のコードでは起動されません。

  • インスタンス化されていないテンプレート

  • 呼び出されない関数 static または extern

  • 呼び出されない未定義のローカル関数

  • 未使用の型および変数

トラブルシューティング

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

すべて展開する

file1.cpp

#include <cstdint>

namespace first_namespace
{
	static std::int32_t global_var; //Compliant- Reused in global namespace
	static std::int32_t reusedVar1;  //Noncompliant
	void reusedVar2();
	static std::int32_t reusedVar3; //Noncompliant
	void use(){
		++reusedVar1;
		reusedVar2();
		++reusedVar3;
	}
}
static std::int32_t file_var = 10; //Compliant - identifier not reused

file2.cpp

#include <cstdint>



static std::int32_t global_var; //Compliant - Reused in global namespace



namespace first_namespace
{
	std::int32_t reusedVar1;
	static std::int32_t reusedVar2;  //Noncompliant
	void f()
	{
		float reusedVar3;
		++reusedVar3;
	}
	void otherUse() {
		++reusedVar2;
	}
}



namespace second_namespace
{
	std::int32_t reusedVar1; //Compliant - Reused in different namespace
}

この例では、Polyspace は両方のファイルで、同じ名前空間内での resusedVar1reusedVar2、および reusedVar3 の再利用にフラグを設定します。Polyspace は、file2.cpp での別の名前空間内の reusedVar1 の再利用にはフラグを設定しません。再利用される識別子の 1 つのインスタンスだけがキーワード static で宣言されている場合、Polyspace はそのインスタンスにフラグを設定することに注意してください。識別子 global_var にはフラグが設定されません。この識別子は別の名前空間、グローバル名前空間、および first_namespace で宣言されているためです。

チェック情報

グループ: 構文規則
カテゴリ: Required、Automated

バージョン履歴

R2020b で導入