Partager via


C28182

avertissement C28182 : Suppression de la référence du pointeur NULL.

Information supplémentaire: <pointer1> contient la même valeur NULL que <pointer2><note>

L'outil d'analyse du code inscrit cet avertissement lorsqu'il confirme que le pointeur peut être NULL.Si il y a 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 résoudre toutes les instances.

<pointer2> est confirmé pour être potentiellement NULL.<pointer1> contient la même valeur que pointer2 et est déréférencé.Comme ces pointeurs peuvent être à des endroits très différents dans le code, les deux sont signalés afin que vous puissiez déterminer pourquoi l'outil d'analyse du code inscrit cet avertissement.

Si une instance non confirmée précédent à la condition existe, alors <note> est remplacé par ce texte : « Consulter la ligne <number> pour un emplacement antérieur où cela peut se produire. »

Exemple

L'exemple suivant affiche le code qui peut faire que l'outil d'analyse du code génére ce message d'avertissement.Dans cet exemple, l'outil d'analyse du code détermine que pNodeFree est NULL dans l'instruction d' if , et que le chemin d'accès de code dans le corps du if est pris.Toutefois, comme nBlockSize est potentiellement à zéro, le corps de l'instruction for n'est pas exécuté et pNodeFree est laissé inchangé.pNodeFree est ensuite assigné à pNode, et pNode est utilisé lorsqu'un déréférencement 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 enregistre 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 manière de corriger l'exemple précédent est de vérifier pNode égale à zéro avant le déréférencement afin qu'un déréférencement NULL est évité.Le code suivant illustre 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;
}