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