Sdílet prostřednictvím


Upozornění C26427

Globální inicializátor přistupuje k extern objektu 'symbol' (i.22)

C++ Core Guidelines: I.22: Vyhněte se komplexní inicializaci globálních objektů

Globální objekty mohou být inicializovány v nekonzistentním nebo nedefinovaném pořadí, což znamená, že vzájemné závislosti mezi nimi je rizikové a mělo by se jim vyhnout. Toto vodítko platí, pokud inicializátory odkazují na jiný objekt, který je považován za .extern

Poznámky

Objekt se považuje extern za vyhovující následujícím pravidlům:

  • je to globální proměnná označená specifikátorem extern nebo je to statický člen třídy;
  • není v anonymním oboru názvů;
  • není označen jako const;
  • Statické členy třídy jsou považovány za globální, takže jejich inicializátory jsou také kontrolovány.

Název analýzy kódu: NO_GLOBAL_INIT_EXTERNS

Příklad

Kontrola externí verze:

// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.

// client.cpp
extern int api_version;
bool is_legacy_mode = api_version <= API_LEGACY_VERSION; // C26427, also stale value

Kontrola externí verze byla spolehlivější:

// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.

// client.cpp
extern int api_version;
bool is_legacy_mode() noexcept
{
    return api_version <= API_LEGACY_VERSION;
}