Avertissement C28182
Déréférencement du pointeur NULL.
Informations supplémentaires : <pointer1> contient la même valeur NULL que <le pointeur2> . <Note>
L’outil d’analyse du code signale cet avertissement lorsqu’il confirme que le pointeur peut être NULL. S’il existe des instances non confirmées où l’erreur peut se produire plus tôt dans la trace, l’outil d’analyse du code ajoute le numéro de ligne de la première instance au message d’avertissement afin que vous puissiez modifier le code pour traiter toutes les instances.
<le pointeur2> est confirmé comme étant potentiellement NULL. <pointer1> contient la même valeur que pointer2 et est en cours de déréférencement. Étant donné que ces pointeurs peuvent se trouver à des emplacements différents dans le code, ils sont signalés afin que vous puissiez déterminer pourquoi l’outil d’analyse du code signale cet avertissement.
Si une instance antérieure non confirmée de la condition existe, <la remarque> est remplacée par ce texte : « Voir le numéro> de ligne <d’un emplacement antérieur où cela peut se produire ».
Exemples
L’exemple suivant montre le code qui peut entraîner la génération de ce message d’avertissement par l’outil d’analyse du code. Dans cet exemple, l’outil d’analyse du code détermine qu’il pNodeFree
s’agit de NULL dans l’instruction if
, et le chemin du code dans le corps du if
code est pris. Toutefois, étant donné qu’il nBlockSize
est potentiellement égal à zéro, le corps de l’instruction for
n’est pas exécuté et pNodeFree
n’est pas modifié. pNodeFree
est ensuite affecté à pNode
, et pNode
est utilisé pendant qu’une déréférence NULL peut se produire.
typedef struct xlist {
struct xlist *pNext;
struct xlist *pPrev;
} list;
list *pNodeFree;
list *masterList;
int nBlockSize;
void fun()
{
if (pNodeFree == 0)
{
list *pNode = masterList;
for (int i = nBlockSize-1; i >= 0; i--, pNode--)
{
pNode->pNext = pNodeFree;
pNodeFree = pNode;
}
}
list* pNode = pNodeFree;
pNode->pPrev = 0;
}
L’outil d’analyse du code signale l’avertissement suivant :
:\sample\testfile.cpp(24) : warning C28182: Dereferencing NULL pointer. 'pNode' contains the same NULL value as 'pNodeFree' did.: Lines: 12, 14, 16, 23, 24
Une façon de corriger l’exemple précédent consiste à case activée pNode
pour zéro avant de le déréférer afin qu’une déférence NULL soit inversée. Le code suivant montre cette correction.
typedef struct xlist {
struct xlist *pNext;
struct xlist *pPrev;
} list;
list *pNodeFree;
list *masterList;
int nBlockSize;
void fun()
{
if (pNodeFree == 0)
{
list *pNode = masterList;
for (int i = nBlockSize-1; i >= 0; i--, pNode--)
{
pNode->pNext = pNodeFree;
pNodeFree = pNode;
}
}
list* pNode = pNodeFree;
if(pNode != 0)
pNode->pPrev = 0;
}