Compartilhar via


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