2010-12-24 8 views
0

winbase.hでは、DeviceIoControl関数は次のように定義されています。Microsoft SAL注釈 - オプションパラメータ

BOOL 
WINAPI 
DeviceIoControl(
    __in  HANDLE hDevice, 
    __in  DWORD dwIoControlCode, 
    __in_bcount_opt(nInBufferSize) LPVOID lpInBuffer, 
    __in  DWORD nInBufferSize, 
    __out_bcount_part_opt(nOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer, 
    __in  DWORD nOutBufferSize, 
    __out_opt LPDWORD lpBytesReturned, 
    __inout_opt LPOVERLAPPED lpOverlapped 
    ); 

パラメータlpBytesReturnedの注釈が任意に定義されています。
しかし、呼び出し側が同期I/Oを使用する場合は、オプションのパラメータではありません。
呼び出し元がNullをlpBytesReturnedに設定し、同期I/Oを使用すると、アプリケーションが停止する可能性があります。

私が機能を作るとき、私はこの問題に直面することがよくあります。
私はこれをSALからどのように表現するのか分かりません。

これを表すアノテーションはありますか?

P.SできるだけSALタグを作成してください。まだSOにタグはありません。

+0

oh、thanks Necrolis – Benjamin

答えて

2

これは、現在のバージョンのSALアノテーションの制限です。パラメータがNULLの場合、SDKおよびDDKヘッダーの注釈は_optを使用する必要があります。 _optサフィックスがなければ、誤検知が多すぎます。

DDKの注釈はより強力で、より良い制御を可能にするconditional annotationsを含みます。したがって、パラメータがNULLであることが許可されているときに他のパラメータから把握できる場合は、__drv_whenを使用してアノテーションを改善することができます。