Aviso C26427
O inicializador global acessa o objeto externo 'símbolo' (i.22)
Diretrizes Principais do C++: I.22: evitar inicialização complexa de objetos globais
Objetos globais podem ser inicializados em uma ordem inconsistente ou indefinida, o que significa que a interdependência entre eles é arriscada e deve ser evitada. Essa diretriz é aplicável quando inicializadores se referem a outro objeto que é considerado extern
.
Comentários
Um objeto será considerado extern
se estiver em conformidade com as seguintes regras:
- é uma variável global marcada com
extern
especificador ou é um membro estático de uma classe; - não está em um namespace anônimo;
- não está marcado como
const
; - Os membros da classe estática são considerados globais e, portanto, seus inicializadores também são verificados.
Nome da análise de código: NO_GLOBAL_INIT_EXTERNS
Exemplo
Verificação de versão externa:
// 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
Verificação de versão externa tornada mais confiável:
// 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;
}