Microsoft SAL注释-optional参数

时间:2010-12-24 02:37:54

标签: windows winapi annotations static-analysis microsoft-sal

在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表达这个。

是否有注释来表达这一点?

P.S如果可以,请制作SAL标签。 SO中没有标签。

1 个答案:

答案 0 :(得分:2)

这是SAL注释的当前版本的限制。当参数可以为NULL时,SDK和DDK标头中的注释必须使用_opt。没有_opt后缀,你会得到太多的误报。

DDK中的注释功能更强大,包括conditional annotations,可以更好地控制。因此,如果您可以在允许参数为NULL时从其他参数中找出答案,则可以使用__drv_when来获得更好的注释。