Вопрос

В 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 для получения лучших аннотаций.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top