C28182

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

追加情報: <pointer1> は <pointer2> が <note>をした null 値が含まれます。

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

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

条件の未確認の前のインスタンスが存在する場合は、<note> はこのテキストに置き換えられます: 「This is」発生する前の位置の行 <number> を参照してください。

使用例

次の例では、コード分析ツールがこの警告メッセージを生成するためのコードを示します。この例では、コード分析ツールは、pNodeFree が if のステートメントで null である 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;
}