exponenta event banner

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

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

Описание

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

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

Объяснение

Объекты со статической длительностью хранения остаются доступными в течение всего выполнения программы. К ним относятся:

  • Объекты, не являющиеся членами проекта, с внешней связью, на которые можно ссылаться из любой единицы перевода проекта.

  • Объекты, объявленные с помощью static спецификатор класса. Эти объекты имеют внутреннюю связь и могут упоминаться из любого объема в пределах их единицы перевода.

При повторном использовании имени идентификатора один идентификатор может быть ошибочным для другого.

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

Внедрение Polyspace

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

  • При объявлении функции в пространстве имен с помощью static спецификатор класса и повторно использовать идентификатор функции для объявления нестатической функции в другом пространстве имен, Polyspace помечает идентификатор статической функции. Например, в этом фрагменте кода идентификатор func повторно используется в пространстве имен NS_2 но он помечен в пространстве имен NS_1.

    namespace NS_1 {
        static void func(void); // Polyspace flags this use of "func".
    };
    
    namespace NS_2 {
        void func(void); //"func" identifier reused but this is not a static function.
    }
    
    

  • При повторном использовании идентификатора локальной переменной Polyspace помечает идентификатор глобальной переменной.

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

Средство проверки не создается для неиспользуемого кода, например

  • Неподтвержденные шаблоны

  • Неуместный static или extern функции

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

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

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

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

Примеры

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

file1.cpp

#include <cstdint>

namespace first_namespace
{
	static std::int32_t global_var = 0;

}
static std::int32_t file_var = 10; //Compliant - identifier not reused

file2.cpp

;

#include <cstdint>

namespace first_namespace
{
	static std::int32_t global_var = 0;  // Noncompliant - identifier reused
	static std::int16_t module_var = 20; // Compliant - identifier not reused
}




namespace second_namespace
{

	void globalfunc(int argument) // non-static global function and arguments do not raise violation
	{
		int local_var; // local variable
		static std::int16_t local_static; // Object with no linkage
	}
	std::int16_t globalvar_reusedinlocal; 
	std::int16_t globalvar_notreused; // Compliant, identifier not reused
	void foo(){
		++globalvar_reusedinlocal;
		++globalvar_notreused;
	}
};

namespace third_namespace
{

	void globalfunc(int argument) // non-static global function and arguments do not raise violation
	{
		static std::int16_t local_static; // Object with no linkage
		int local_var; // local variable
		int globalvar_reusedinlocal; // Non-compliant, identifier reused in local variable
		++globalvar_reusedinlocal;
	}

};

В этом примере: global_var объявляется с помощью static спецификатор класса в исходном файле file1.cpp. Этот идентификатор повторно используется в исходном файле file2.cpp. В том же файле, globalvar_reusedinlocal объявлен в second_namespace и имеет внешнюю связь. Это объявление несовместимо, поскольку идентификатор повторно используется для локальной переменной в globalfunc.

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

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