Partilhar via


Aviso C26427

O inicializador global acessa o 'símbolo' do objeto externo (i.22)

Diretrizes principais do C++: I.22: Evitar a inicialização complexa de objetos globais

Os 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. Esta diretriz é aplicável quando os inicializadores se referem a outro objeto considerado como extern.

Observações

Um objeto é 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, 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;
}