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,则它不是可选参数。
如果调用者将 Null放入 lpBytesReturned并使用同步 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 回答