Partager via


UninitializedPtrField (requête CodeQL du pilote Windows)

Vue d’ensemble

Un champ de pointeur qui n’a pas été initialisé pendant ou depuis la construction de la classe entraînera une déréférence de pointeur nul.

Recommandation

Assurez-vous d’initialiser tous les champs de pointeur avant utilisation.

Exemple

L’exemple suivant montre un scénario où le champ ptr_ n’est pas initialisé et est ensuite déréférencé :

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 initialisons le champ avant 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();
}

Détails supplémentaires

Cette requête peut être trouvée dans le référentiel Microsoft GitHub CodeQL. Consultez la page CodeQL et le test du logo des outils statiques pour plus de détails sur la manière dont les développeurs de pilotes Windows peuvent télécharger et exécuter CodeQL.