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