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 спецификатор класса.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

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
static void Global_func();

file2.cpp

#include <cstdint>

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

static void Global_func(); // - Non-compliant - identifier 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; // Non-compliant, identifier reused in local variable
std::int16_t globalvar_notreused; // Compliant, identifier not reused

};

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;
}
};

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

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

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