C28197

警告 C28197: メモリがリークしている可能性があります

この警告は、リソースを別の場所に別名化することになる可能性がある場合に、メモリ リークとリソース リークの両方についてレポートします。

ポインター は、明示的に解放されなかった、割り当て済みのメモリか別の割り当て済みのリソースを指します。 この警告は、通常は呼び出される側の関数に対する注釈が不適切であることが原因で発生しますが、呼び出す側の関数に対する注釈が不適切であることが原因で発生する可能性が高いです。

入力引数に注釈 __drv_freesMem または __drv_aliasesMem がある場合、この警告が関数の終了時にレポートされることがあります。 この警告は、通常、有効なリークが発生したか、現在の関数に呼び出された関数に追加の注釈が必要であることを示します。

特に、この警告は基本的な注釈 _In__Out_ がない場合に出される可能性がかなり高いですが、注釈 __drv_aliasesMem__drv_freesMem が必要な可能性もあります。 擬陽性は、_In_ 注釈がない場合に生じる可能性があります。

ポインターを受け取り、リークを回避するために別名化する関数には、__drv_aliasesMem の注釈を付ける必要があります。 オブジェクトをグローバル構造体に挿入する関数を作成する場合、またはこの作業を行うシステム関数に渡す場合は、__drv_aliasesMem 注釈を追加する必要があります。

メモリを解放する関数には、__drv_freesMem の注釈を付ける必要があります。 メモリを解放する主な関数には、既にこの注釈があります。

次のコード例では、この警告が生成されます。

char *p = (char *)malloc(10);
test(p);   // does not save a copy of p

次のコード例では、この警告は生成されません。

char *p = (char *)malloc(10);
test(p);   // does not save a copy of p
free(p);