Rediger

Del via


Warning C26427

Global initializer accesses extern object 'symbol' (i.22)

C++ Core Guidelines: I.22: Avoid complex initialization of global objects

Global objects may be initialized in an inconsistent or undefined order, which means that interdependency between them is risky and should be avoided. This guideline is applicable when initializers refer to another object that's considered to be extern.

Remarks

An object is deemed extern if it conforms to the following rules:

  • it's a global variable marked with extern specifier or it's a static member of a class;
  • it's not in an anonymous namespace;
  • it's not marked as const;
  • Static class members are considered global, so their initializers are also checked.

Code analysis name: NO_GLOBAL_INIT_EXTERNS

Example

External version check:

// 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

External version check made more reliable:

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