Exporter (0) Imprimer
Développer tout
Développer Réduire
Cet article a fait l'objet d'une traduction automatique. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
Traduction
Source

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. »

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

Ajouts de la communauté

AJOUTER
Microsoft réalise une enquête en ligne pour recueillir votre opinion sur le site Web de MSDN. Si vous choisissez d’y participer, cette enquête en ligne vous sera présentée lorsque vous quitterez le site Web de MSDN.

Si vous souhaitez y participer,
Afficher:
© 2014 Microsoft