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