Udostępnij przez


UninitializedPtrField (Zapytanie CodeQL sterownika systemu Windows)

Przegląd

Pole wskaźnika, które nie zostało zainicjowane podczas lub od czasu konstrukcji klasy, spowoduje dereferencję null wskaźnika.

Rekomendacja

Pamiętaj, aby zainicjować wszystkie pola wskaźnika przed użyciem.

Przykład

W poniższym przykładzie przedstawiono scenariusz, w którym pole ptr_ nie zostało zainicjowane i zostaje później poddane wyłuszczeniu.

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();
}

Aby rozwiązać ten problem, ustawiliśmy pole przed użyciem:

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();
}

Dodatkowe szczegóły

To zapytanie można znaleźć w repozytorium Microsoft GitHub CodeQL. Zobacz stronę CodeQL i Static Tools Logo Test, aby uzyskać szczegółowe informacje na temat pobierania i uruchamiania CodeQL przez programistów sterowników systemu Windows.