Partager via


UninitializedPtrField (requête CodeQL du pilote Windows)

Aperçu

Un champ de pointeur qui n’a pas été initialisé lors de la construction de la classe ou après celle-ci provoquera une déréférence de pointeur nul.

Recommandation

Veillez à initialiser tous les champs de pointeur avant l’utilisation.

Exemple :

L’exemple suivant montre un scénario dans lequel le champ ptr_ n’est pas initialisé et déréférencé ultérieurement :

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

Pour corriger le problème, nous définissons le champ avant l’utilisation :

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

Informations supplémentaires

Cette requête se trouve dans le référentiel Microsoft GitHub CodeQL. Consultez la page CodeQL et Static Tools Logo Test pour plus d’informations sur la façon dont les développeurs windows Driver peuvent télécharger et exécuter CodeQL.