Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Información general
Un campo de puntero que no se inicializó durante o desde la construcción de la clase provocará una desreferenciación de un puntero nulo.
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. Consulta la página CodeQL y la Static Tools Logo Test para obtener más información sobre cómo los desarrolladores de controladores de Windows pueden descargar y ejecutar CodeQL.