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 's аннотация определяется необязательно.
Но это не обязательный параметр, если вызывающая сторона использует синхронный ввод-вывод.
Если вызывающая сторона устанавливает Null в lpBytesReturned и использует синхронный ввод-вывод, приложение может быть умирает.
Когда я выполняю функцию, я часто сталкиваюсь с этой проблемой.
Я понятия не имею, как выразить это из SAL.
Есть ли аннотация, чтобы выразить это?
PS Пожалуйста, сделайте тег SAL, если можете. В SO пока нет тегов.
1 ответ
Это ограничение текущей версии аннотаций SAL. Аннотации в заголовках SDK и DDK должны использовать _opt, когда параметр может иметь значение NULL. Без суффикса _opt вы получите слишком много ложных срабатываний.
Аннотации в DDK являются более мощными и включают условные аннотации, которые обеспечивают лучший контроль. Поэтому, если бы вы могли выяснить из других параметров, когда параметру разрешено принимать значение NULL, вы могли бы использовать __drv_when для получения лучших аннотаций.