Warnung C26427

Globaler Initialisierer greift auf externes Objekt "Symbol" zu (i.22)

C++-Kernrichtlinien: I.22: Vermeiden komplexer Initialisierung globaler Objekte

Globale Objekte können in einer inkonsistenten oder nicht definierten Reihenfolge initialisiert werden, was bedeutet, dass die Interabhängigkeit zwischen ihnen riskant ist und vermieden werden sollte. Diese Richtlinie gilt, wenn Initialisierer auf ein anderes Objekt verweisen, das als gilt extern.

Hinweise

Ein Objekt gilt, extern wenn es den folgenden Regeln entspricht:

  • es ist eine globale Variable, die mit extern dem Bezeichner gekennzeichnet ist, oder es ist ein statisches Element einer Klasse;
  • es befindet sich nicht in einem anonymen Namespace;
  • es ist nicht als constgekennzeichnet;
  • Statische Klassenmber werden als global betrachtet, sodass ihre Initialisierer ebenfalls überprüft werden.

Codeanalysename: NO_GLOBAL_INIT_EXTERNS

Beispiel

Überprüfung der externen Version:

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

Die überprüfung der externen Version hat zuverlässiger gemacht:

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