UninitializedPtrField (Windows Driver CodeQL Query)
Gambaran Umum
Bidang pointer yang tidak diinisialisasi selama atau karena 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.