exponenta event banner

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