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.
Jangan tetapkan hasil alokasi atau panggilan fungsi dengan nilai pengembalian
owner<T>ke pointer mentah, gunakanowner<T>sebagai gantinya (i.11)
Keterangan
Pemeriksaan ini membantu memberlakukan *aturan I.11: Jangan pernah mentransfer kepemilikan oleh pointer mentah (T*), yang merupakan subset dari aturan R.3: Pointer mentah (T*) bukan milik. Secara khusus, ini memperingatkan pada panggilan apa pun ke operator new, yang menyimpan hasilnya dalam variabel jenis pointer mentah. Ini juga memperingatkan panggilan ke fungsi yang mengembalikan gsl::owner<T> jika hasilnya ditetapkan ke pointer mentah. Idenya adalah bahwa Anda harus dengan jelas menyatakan kepemilikan sumber daya memori. Untuk informasi selengkapnya, lihat Panduan Inti C++.
Cara term mudah untuk memperbaiki peringatan ini adalah dengan menggunakan auto deklarasi jika sumber daya segera ditetapkan pada deklarasi variabel. Jika perbaikan ini tidak memungkinkan, kami sarankan Anda menggunakan jenis gsl::owner<T>.
auto Deklarasi yang diinisialisasi dengan operator new adalah "pemilik" karena kami berasumsi bahwa hasil alokasi apa pun secara implisit adalah penunjuk pemilik. Kami mentransfer asumsi ini ke auto variabel dan memperlakukannya sebagai owner<T>.
Jika pemeriksaan ini menandai panggilan ke fungsi yang mengembalikan owner<T>, itu mungkin merupakan indikasi bug yang sah dalam kode. Pada dasarnya, itu menunjuk ke tempat di mana kode membocorkan gagasan eksplisit tentang kepemilikan (dan mungkin sumber daya itu sendiri).
Aturan ini saat ini hanya memeriksa variabel lokal. Jika Anda menetapkan alokasi ke parameter formal, variabel global, anggota kelas, dan sebagainya, itu tidak ditandai. Cakupan yang sesuai dari skenario tersebut direncanakan untuk pekerjaan di masa mendatang.
Nama analisis kode: NO_RAW_POINTER_ASSIGNMENT
Contoh 1: Alokasi sederhana
char *buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // C26400
Contoh 2: Alokasi sederhana (diperbaiki dengan gsl::owner<T>)
gsl::owner<char*> buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // OK
Contoh 3: Alokasi sederhana (diperbaiki dengan auto)
auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK