次の方法で共有


C28182

警告 C28182: null ポインターの逆参照。

追加情報: <pointer1> は <pointer2> が <メモ> をした null 値が含まれています

コード分析ツールは、ポインターは null 以外であるかどうか確認する場合は、この警告を報告します。エラーがトレースに発生する可能性のある未確認のインスタンスがある場合、コード分析ツールは、警告メッセージにすべてのインスタンスに対応するためにコードを変更できるように、最初のインスタンスの行数を追加します。

<pointer2> が null であることが確認されます。 <pointer1> は pointer2 と同じ値を指定し、逆参照されています。これらのポインターをコード内の異なる場所非常にある場合は、コード分析ツールがこの警告理由をレポートしているのかを判断できるように両方の報告されます。

要件の未確認の前のインスタンスである場合は、 <メモ> はこのテキストで置き換えられます: 「This is」発生する可能性がある以前の場所については行 <数値> を参照してください。

使用例

次の例では、コード分析ツールがこの警告メッセージを生成する可能性のあるコードを次に示します。この例では、コード分析ツールは pNodeFree が if ステートメントで空白である、 if 本体のコード パスは連結ことを確認します。ただし、 nBlockSize が、ゼロであるため、 for ステートメントの本体は実行されず、 pNodeFree オブジェクは変更されません。pNodeFree は pNodeに代入、 null の逆参照が発生する可能性がある間、 pNode が使用されます。

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

コード分析ツールは、次の警告が報告されます:

:\sample\testfile.cpp(24) : warning C28182: Dereferencing NULL pointer. 'pNode' contains the same NULL value as 'pNodeFree' did.: Lines: 12, 14, 16, 23, 24

前の例を修正する 1 とおりの方法は、 null の逆参照を避けられるように、を逆参照する前にゼロに pNode をチェックすることです。次のコードは、この変更を示します。

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