2010-12-24 5 views
0

winbase.h에서 DeviceIoControl 함수는 다음과 같이 정의됩니다.Microsoft SAL annotation - 선택 매개 변수

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의 주석은 옵션으로 정의된다.
그러나 호출자가 동기 입출력을 사용하는 경우에는 선택적 매개 변수가 아닙니다.
호출자가 Null을 lpBytesReturned으로 설정하고 동기 I/O를 사용하는 경우 응용 프로그램이 죽을 수 있습니다.

기능을 만들 때 종종이 문제에 직면합니다.
SAL에서 이것을 표현하는 방법을 모르겠습니다.

표현할 수있는 특수 효과가 있나요?

P.S 가능한 경우 SAL 태그를 만드십시오. 아직 태그가 없습니다.

+0

오, 감사합니다. Necrolis – Benjamin

답변

2

이것은 현재 버전의 SAL 주석에 대한 제한 사항입니다. SDK 및 DDK 헤더의 주석은 매개 변수가 NULL 일 때 _opt를 사용해야합니다. _opt 접미어가 없으면 너무 많은 오 탐률을 얻게됩니다.

DDK의 주석은 더 강력하고 더 나은 제어를 허용하는 conditional annotations을 포함합니다. 따라서 매개 변수가 NULL이 될 수있는 다른 매개 변수를 파악할 수 있다면 더 나은 주석을 얻기 위해 __drv_when을 사용할 수 있습니다.