在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中没有标签。
答案 0 :(得分:2)
这是SAL注释的当前版本的限制。当参数可以为NULL时,SDK和DDK标头中的注释必须使用_opt。没有_opt后缀,你会得到太多的误报。
DDK中的注释功能更强大,包括conditional annotations,可以更好地控制。因此,如果您可以在允许参数为NULL时从其他参数中找出答案,则可以使用__drv_when来获得更好的注释。