exponenta event banner

Правило AUTOSAR C++ 14 A2-10-4

Имя идентификатора объекта, не являющегося членом, со статической длительностью хранения или статической функцией не должно использоваться повторно в пространстве имен

Описание

Определение правила

Имя идентификатора объекта, не являющегося членом, со статической длительностью хранения или статической функцией не должно повторно использоваться в пространстве имен.

Объяснение

Пространства имен используются для сужения области идентификаторов, объявленных в этих пространствах имен. Это предотвращает ошибку этих идентификаторов с идентичными идентификаторами в других областях. При повторном использовании идентификатора со статической длительностью хранения в пределах одного пространства имен для исходных файлов один идентификатор может быть ошибочным для другого.

Внедрение Polyspace

  • При повторном использовании идентификаторов Polyspace ® помечает последнее использование идентификатора, если они находятся в одной и той же единице преобразования. Если идентификаторы находятся в отдельных файлах, то идентификатор в последнем пути к файлу помечается в алфавитном порядке.

    Однако если повторно использовать идентификатор, но объявить только один экземпляр идентификатора с ключевым словом 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 функции

  • Неустановленные и неопределенные локальные функции

  • Неиспользуемые типы и переменные

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

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 помечает повторное использование resusedVar1, reusedVar2, и reusedVar3 в одном пространстве имен в обоих файлах. Polyspace не помечает повторное использование reusedVar1 в другом пространстве имен в file2.cpp. Обратите внимание, что, когда только один экземпляр повторно используемого идентификатора объявлен с ключевым словом static, Polyspace помечает этот экземпляр. Идентификатор global_var не помечен, поскольку он объявлен в различных пространствах имен, глобальном пространстве имен и first_namespace.

Проверить информацию

Группа: Лексические конвенции
Категория: Обязательно, Автоматизировано
Представлен в R2020b