Bagikan melalui


Peringatan C26427

Penginisialisasi global mengakses objek ekstern 'simbol' (i.22)

C++ Pedoman Inti: I.22: Hindari inisialisasi kompleks objek global

Objek global dapat diinisialisasi dalam urutan yang tidak konsisten atau tidak terdefinisi, yang berarti bahwa interdependensi di antara mereka berisiko dan harus dihindari. Pedoman ini berlaku ketika penginisialisasi merujuk ke objek lain yang dianggap extern.

Keterangan

Objek dianggap extern jika sesuai dengan aturan berikut:

  • ini adalah variabel global yang ditandai dengan extern penentu atau merupakan anggota statis kelas;
  • tidak ada di namespace anonim;
  • tidak ditandai sebagai const;
  • Anggota kelas statis dianggap global, sehingga inisialisasi mereka juga diperiksa.

Nama analisis kode: NO_GLOBAL_INIT_EXTERNS

Contoh

Pemeriksaan versi eksternal:

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

Pemeriksaan versi eksternal dibuat lebih dapat diandalkan:

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