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.
Gambaran Umum
Bidang pointer yang tidak diinisialisasi selama atau setelah konstruksi kelas akan menyebabkan dereferensi pointer null.
Rekomendasi
Pastikan untuk menginisialisasi semua bidang penunjuk sebelum penggunaan.
Contoh
Contoh berikut menunjukkan skenario di mana bidang ptr_ tidak diinisialisasi dan kemudian didereferensikan:
template <typename T>
class ComPtr
{
public:
T* ptr_;
ComPtr() throw() : ptr_(nullptr)
{
}
ComPtr(T* ptr) throw() : ptr_(ptr)
{
}
T* operator->() const throw()
{
return ptr_;
}
void set(T* ptr) {
ptr_ = ptr;
}
T** addr() {
return &ptr_;
}
};
class Test
{
public:
int it_;
int it() {
return it_;
}
};
void test() {
Test t;
int val;
ComPtr<Test> ptr;
// BAD: pointer is not initialized here
val = ptr->it();
}
Untuk memperbaiki masalah, kami mengatur bidang sebelum penggunaan:
template <typename T>
class ComPtr
{
public:
T* ptr_;
ComPtr() throw() : ptr_(nullptr)
{
}
ComPtr(T* ptr) throw() : ptr_(ptr)
{
}
T* operator->() const throw()
{
return ptr_;
}
void set(T* ptr) {
ptr_ = ptr;
}
T** addr() {
return &ptr_;
}
};
class Test
{
public:
int it_;
int it() {
return it_;
}
};
void test() {
Test t;
int val;
ComPtr<Test> ptr2(&t);
// GOOD: pointer was initialized
val = ptr2->it();
ComPtr<Test> ptr3;
ptr3.set(&t);
// GOOD: pointer was set in between
val = ptr3->it();
}
Detail Tambahan
Kueri ini dapat ditemukan di repositori Microsoft GitHub CodeQL. Lihat halaman CodeQL dan Static Tools Logo Test untuk detail tentang bagaimana pengembang Driver Windows dapat mengunduh dan menjalankan CodeQL.