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.