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