Compartir a través de


UninitializedPtrField (consulta de CodeQL del controlador de Windows)

Información general

Un campo de puntero que no se inicializó durante o puesto que la construcción de la clase provocará una desreferencia del puntero null.

Recomendación

Asegúrese de inicializar todos los campos de puntero antes del uso.

Ejemplo

En el ejemplo siguiente se muestra un escenario en el que el campo ptr_ no se inicializa y se desreferencia más adelante:

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

Para corregir el problema, establecemos el campo antes del uso:

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

Detalles adicionales

Esta consulta se puede encontrar en el repositorio de Microsoft GitHub CodeQL. Consulte la página CodeQL y la prueba de logotipos de herramientas estáticas para obtener más información sobre cómo los desarrolladores de controladores de Windows pueden descargar y ejecutar CodeQL.