Bagikan melalui


Peringatan C26411

Parameter 'parameter' adalah referensi ke pointer unik dan tidak pernah ditetapkan ulang atau diatur ulang, gunakan T* atau T& sebagai gantinya (r.33)

Saat Anda meneruskan penunjuk unik ke fungsi berdasarkan referensi, itu menyiratkan bahwa sumber dayanya dapat dirilis atau ditransfer di dalam fungsi. Jika fungsi menggunakan parameternya hanya untuk mengakses sumber daya, aman untuk meneruskan pointer mentah atau referensi. Untuk informasi selengkapnya, lihat Aturan Pedoman Inti C++ R.33: Mengambil widget< unique_ptr>& parameter untuk mengekspresikan bahwa fungsi memasang kembali widget.

Keterangan

  • Batasan dari peringatan C26410 juga berlaku di sini.

  • Heuristik untuk mendeteksi release atau reset mengakses penunjuk unik adalah naif. Kami hanya mendeteksi panggilan ke operator penugasan dan ke fungsi bernama reset (tidak peka huruf besar/kecil). Jelas, deteksi ini tidak mencakup semua kemungkinan kasus modifikasi pointer pintar. (Misalnya, tidak mendeteksi std::swap, atau non-fungsiconst khusus dalam penunjuk pintar kustom). Kami mengharapkan peringatan ini dapat menghasilkan banyak positif palsu pada jenis kustom, dan dalam beberapa skenario yang berurusan dengan pointer unik standar. Kami berharap dapat meningkatkan heuristik karena kami menerapkan lebih banyak pemeriksaan yang berfokus pada penunjuk cerdas.

  • Fakta bahwa pointer pintar seringkali merupakan templat membawa batasan yang menarik. Pengkompilasi tidak diperlukan untuk memproses kode templat dalam templat jika tidak digunakan. Dalam kode yang membuat penggunaan terbatas antarmuka penunjuk pintar, pemeriksa dapat menghasilkan hasil yang tidak terduga. Pemeriksa tidak dapat mengidentifikasi semantik jenis templat dengan benar, karena beberapa fungsi mungkin tidak pernah digunakan. Untuk standar std::unique_ptr, batasan ini dimitigasi dengan mengenali nama jenis. Analisis ini dapat diperluas di masa depan untuk mencakup pointer pintar yang lebih terkenal.

  • Ekspresi Lambda yang melakukan capture-by-reference implisit dapat menyebabkan peringatan mengejutkan tentang referensi ke pointer unik. Saat ini, semua parameter referensi yang diambil dalam lambda dilaporkan, terlepas dari apakah parameter tersebut direset atau tidak. Rilis mendatang dapat memperluas heuristik untuk menghubungkan bidang lambda dan parameter lambda.

Nama analisis kode: NO_REF_TO_UNIQUE_PTR

Contoh: Referensi yang tidak perlu

void TraceValid(std::unique_ptr<Slot> &slot)    // C26411
{
    if (!IsDamaged(slot.get()))
        std::cout << *slot.get();
}

void ReleaseValid(std::unique_ptr<Slot> &slot)  // OK
{
    if (!IsDamaged(slot.get()))
        slot.reset(nullptr);
}