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.
Simbol tidak pernah diuji untuk nullness, dapat ditandai sebagai
gsl::not_null.
Pedoman Inti C++: F.23: Gunakan not_null<T> untuk menunjukkan bahwa "null" bukan nilai yang valid
Ini adalah praktik umum untuk menggunakan pernyataan untuk menegakkan asumsi tentang validitas nilai pointer. Masalahnya adalah, pernyataan tidak mengekspos asumsi melalui antarmuka (seperti dalam jenis pengembalian atau parameter). Pernyataan juga lebih sulit untuk dipertahankan dan tetap sinkron dengan perubahan kode lainnya. Rekomendasinya adalah menggunakan gsl::not_null dari Pustaka Dukungan Pedoman untuk menandai sumber daya yang seharusnya tidak pernah memiliki nilai null. Aturan USE_NOTNULL ini membantu mengidentifikasi tempat yang menghilangkan pemeriksaan null dan karenanya dapat diperbarui untuk menggunakan gsl::not_null.
Keterangan
Logika aturan memerlukan kode untuk mendereferensikan variabel penunjuk sehingga pemeriksaan null (atau penerapan nilai non-null) akan dibenarkan. Jadi, peringatan dipancarkan hanya jika pointer didereferensikan dan tidak pernah diuji untuk null.
Implementasi saat ini hanya menangani pointer biasa (atau aliasnya) dan tidak mendeteksi penunjuk pintar, meskipun gsl::not_null dapat diterapkan ke penunjuk pintar juga.
Variabel ditandai sebagai diperiksa null saat digunakan dalam konteks berikut:
- sebagai ekspresi simbol dalam kondisi cabang, misalnya,
if (p) { ... }; - operasi logis non-bitwise;
- operasi perbandingan di mana satu operand adalah ekspresi konstanta yang mengevaluasi ke nol.
Aturan tidak memiliki pelacakan aliran data penuh. Ini dapat menghasilkan hasil yang salah dalam kasus di mana pemeriksaan tidak langsung digunakan (seperti ketika variabel perantara menyimpan nilai null dan kemudian digunakan dalam perbandingan).
Nama analisis kode: USE_NOTNULL
Contoh
Harapan tersembunyi:
using client_collection = gsl::span<client*>;
// ...
void keep_alive(const connection *connection) // C26429
{
const client_collection clients = connection->get_clients();
for (ptrdiff_t i = 0; i < clients.size(); i++)
{
auto client = clients[i]; // C26429
client->send_heartbeat();
// ...
}
}
Ekspektasi tersembunyi diklarifikasi oleh gsl::not_null:
using client_collection = gsl::span<gsl::not_null<client*>>;
// ...
void keep_alive(gsl::not_null<const connection*> connection)
{
const client_collection clients = connection->get_clients();
for (ptrdiff_t i = 0; i < clients.size(); i++)
{
auto client = clients[i];
client->send_heartbeat();
// ...
}
}