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

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

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

Примеры

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

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

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