Condividi tramite


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