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