UninitializedPtrField (CodeQL-Abfrage für Windows-Treiber)
Übersicht
Ein Zeigerfeld, das während oder seit der Konstruktion der Klasse nicht initialisiert wurde, führt zu einer Null-Zeiger-Dereferenz.
Empfehlung
Stellen Sie sicher, dass Sie alle Zeigerfelder vor der Verwendung initialisieren.
Beispiel
Das folgende Beispiel zeigt ein Szenario, in dem das Feld ptr_ nicht initialisiert und später dereferenziert wird:
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();
}
Um das Problem zu beheben, setzen wir das Feld vor der Verwendung:
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();
}
Zusätzliche Details
Diese Abfrage kann im Microsoft GitHub CodeQL Repository gefunden werden. Auf der Seite CodeQL und der Seite Static Tools Logo Test finden Sie Einzelheiten darüber, wie Windows-Treiber-Entwickler CodeQL herunterladen und ausführen können.