Аннотация Microsoft Sal -Optional
-
13-10-2019 - |
Вопрос
В 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
);
Параметр LpbytesturnАннотация определена необязательна.
Но это не необязательный параметр, если вызывающий вызывающий синхронный ввод -вывод.
Если вызывающий абонент ставит NULL на Lpbytesturn и использует синхронное ввод -вывод, приложение может быть умереть.
Когда я делаю функцию, я часто сталкиваюсь с этой проблемой.
Я понятия не имею, как выразить это из SAL.
Есть ли аннотация, чтобы выразить это?
PS Пожалуйста, сделайте SAL Tag, если можете. Пока нет тега.
Решение
Это ограничение текущей версии аннотаций SAL. Аннотации в заголовках SDK и DDK должны использовать _OPT, когда параметр может быть нулевым. Без суффикса _opt вы получите слишком много ложных срабатываний.
Аннотации в DDK более мощные и включают условные аннотации что позволяет лучше контролировать. Поэтому, если вы могли бы выяснить из других параметров, когда параметр разрешено быть нулевым, вы можете использовать __drv_when для получения лучших аннотаций.