AUTOSAR C++14 Rule 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