Compartir vía


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