Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Objek penjaga harus diberi nama (cp.44)
Panduan Inti C++
CP.44: Ingatlah untuk memberi nama lock_guard dan unique_lock Anda
Keterangan
Pustaka standar menyediakan kunci untuk membantu mengontrol akses bersamaan ke sumber daya selama masa pakainya. Saat Anda mendeklarasikan objek kunci tanpa nama, pengkompilasi membuat objek sementara yang segera dihancurkan daripada objek yang hidup di akhir cakupan penutup. Jadi, kegagalan untuk menetapkan objek kunci ke variabel adalah kesalahan yang secara efektif menonaktifkan mekanisme penguncian (karena variabel sementara bersifat sementara). Aturan ini menangkap kasus sederhana dari perilaku yang tidak diinginkan tersebut.
Diagnostik ini hanya menganalisis jenis std::scoped_lockkunci standar , , std::unique_lockdan std::lock_guard. Peringatan C26444 mencakup jenis RAII lain yang tidak disebutkan namanya.
Penganalisis hanya menganalisis panggilan sederhana ke konstruktor. Ekspresi inisialisasi yang lebih kompleks dapat menyebabkan hasil yang tidak akurat dalam bentuk peringatan yang terlewat. Penganalisis mengabaikan kunci yang diteruskan sebagai argumen ke panggilan fungsi atau dikembalikan dari panggilan fungsi. Tidak dapat menentukan apakah kunci tersebut sengaja mencoba melindungi panggilan fungsi tersebut atau apakah masa pakainya harus diperpanjang. Untuk memberikan perlindungan serupa untuk jenis yang dikembalikan oleh panggilan fungsi, anotasi dengan [[nodiscard]]. Anda juga dapat membuat anotasi konstruktor dengan [[nodiscard]] untuk menghindari objek yang tidak disebutkan namanya dari jenis tersebut:
struct X { [[nodiscard]] X(); };
void f() {
X{}; // warning C4834
}
Penganalisis mengabaikan kunci yang dibuat sebagai sementara tetapi ditetapkan ke referensi bernama untuk memperpanjang masa pakainya.
Nama analisis kode: NO_UNNAMED_GUARDS
Contoh
Dalam contoh ini, nama kunci terlingkup hilang.
void print_diagnostic(std::string_view text)
{
auto stream = get_diagnostic_stream();
if (stream)
{
std::lock_guard<std::mutex>{ diagnostic_mutex_ }; // C26441
write_line(stream, text);
}
}
Untuk memperbaiki kesalahan, beri nama pada kunci, yang memperpanjang masa pakainya.
void print_diagnostic(std::string_view text)
{
auto stream = get_diagnostic_stream();
if (stream)
{
std::lock_guard<std::mutex> lock{ diagnostic_mutex_ };
write_line(stream, text);
}
}