0

winbase.h では、DeviceIoControl 関数は次のように定義されています。

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 を使用する場合、これはオプションのパラメーターではありません。
呼び出し元がlpBytesReturnedに Null を設定し、同期 I/O を使用すると、アプリケーションが停止する可能性があります。

関数を作成するとき、この問題に直面することがよくあります。
SAL からこれを表現する方法がわかりません。

これを表現する注釈はありますか?

PS できればSALタグを作ってください。SOにはまだタグがありません。

4

1 に答える 1

2

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

DDK の注釈はより強力で、より適切な制御を可能にする条件付き注釈が含まれています。そのため、パラメーターを NULL にすることが許可されている場合を他のパラメーターから把握できれば、__drv_when を使用してより適切な注釈を取得できます。

于 2011-01-24T01:43:42.383 に答える