警告 C28182
Null ポインターの逆参照
追加情報:< pointer1> には、pointer2> と同じ NULL 値<が含まれています。 <メモ>
この警告は、ポインターが NULL である可能性があることがコード分析ツールで確認された場合に報告されます。 未確認のインスタンスにおいてトレースの早い段階でエラーが発生する可能性がある場合、コード分析ツールは警告メッセージに最初のインスタンスの行番号を追加して、すべてのインスタンスに対処するようコードを変更できます。
<pointer2> は NULL である可能性があることが確認されます。 <pointer1> には pointer2 と同じ値が含まれており、逆参照されています。 これらのポインターはコード内のさまざまな場所に存在する可能性があるため、両方とも報告されるため、コード分析ツールがこの警告を報告している理由を特定できます。
この条件に該当する未確認の以前のインスタンスが存在する場合は、<note> が "これが行われる可能性のある以前の行 <number> を参照してください" というテキストに置き換えられます。
例
次の例は、コード分析ツールによってこの警告メッセージが生成される可能性のあるコードを示しています。 この例では、コード分析ツールによって if
ステートメントの pNodeFree
が NULL であると判断され、if
の本体へのコード パスが取得されます。 ただし、0 である可能性があるため 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 つとしては、逆参照する前に pNode
が 0 であることを確認して、NULL 逆参照が回避されるようにします。 次のコードは、この修正を示しています。
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;
}
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示