Avertissement C26427

L’initialiseur global accède à l’objet extern 'symbol' (i.22)

Instructions principales C++ : I.22 : Éviter l’initialisation complexe d’objets globaux

Les objets globaux peuvent être initialisés dans un ordre incohérent ou non défini, ce qui signifie que l’interdépendance entre eux est risquée et doit être évitée. Cette directive s’applique lorsque les initialiseurs font référence à un autre objet considéré comme externétant .

Notes

Un objet est considéré extern comme conforme aux règles suivantes :

  • il s’agit d’une variable globale marquée avec extern spécificateur ou d’un membre statique d’une classe ;
  • ce n’est pas dans un espace de noms anonyme ;
  • il n’est pas marqué comme const;
  • Les membres de classe statique sont considérés comme globaux, de sorte que leurs initialiseurs sont également case activée.

Nom de l’analyse du code : NO_GLOBAL_INIT_EXTERNS

Exemple

Version externe case activée :

// 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

La version externe case activée rendu plus fiable :

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