Advertencia C26427
El inicializador global accede al objeto extern 'symbol' (i.22)
C++ Core Guidelines: I.22: Evitar la inicialización compleja de objetos globales
Los objetos globales se pueden inicializar en un orden incoherente o no definido, lo que significa que la interdependencia entre ellos es arriesgada y debe evitarse. Esta guía es aplicable cuando los inicializadores hacen referencia a otro objeto que se considera extern
.
Comentarios
Se considera que un objeto es extern
si se ajusta a las reglas siguientes:
- es una variable global marcada con
extern
el especificador o es un miembro estático de una clase; - no está en un espacio de nombres anónimo;
- no está marcado como
const
; - Los miembros de clase estática se consideran globales, por lo que también se comprueban sus inicializadores.
Nombre de análisis de código: NO_GLOBAL_INIT_EXTERNS
Ejemplo
Comprobación de versiones externas:
// 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 comprobación de versiones externa hizo más confiable:
// 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;
}