Avviso C26427
L'inizializzatore globale accede all'oggetto extern 'symbol' (i.22)
Linee guida di base di C++: I.22: Evitare l'inizializzazione complessa di oggetti globali
Gli oggetti globali possono essere inizializzati in un ordine incoerente o non definito, il che significa che l'interdipendenza tra di esse è rischiosa e deve essere evitata. Questa linea guida è applicabile quando gli inizializzatori fanno riferimento a un altro oggetto considerato come extern
.
Osservazioni:
Un oggetto viene considerato conforme extern
alle regole seguenti:
- è una variabile globale contrassegnata con
extern
l'identificatore o è un membro statico di una classe; - non si trova in uno spazio dei nomi anonimo;
- non è contrassegnato come
const
; - I membri di classe statici sono considerati globali, quindi vengono controllati anche i relativi inizializzatori.
Nome dell'analisi del codice: NO_GLOBAL_INIT_EXTERNS
Esempio
Controllo della versione esterna:
// 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
Controllo della versione esterna reso più affidabile:
// 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;
}