다음을 통해 공유


STRICT 규정 준수

STRICT 형식 검사를 사용하도록 설정하면 성공적으로 컴파일되는 일부 소스 코드에서 오류 메시지가 생성될 수 있습니다. 다음 섹션에서는 STRICT 가 사용하도록 설정된 경우 코드를 컴파일하기 위한 최소 요구 사항에 대해 설명합니다. 특히 이식 가능한 코드를 생성하려면 추가 단계를 사용하는 것이 좋습니다.

일반 요구 사항

보안 주체 요구 사항은 보다 일반적인 형식에 의존하는 대신 올바른 핸들 형식 및 함수 포인터를 선언해야 한다는 것입니다. 다른 핸들 형식이 필요한 경우 한 핸들 형식을 사용할 수 없습니다. 이는 함수 선언을 변경하고 더 많은 형식 캐스트를 사용해야 할 수도 있음을 의미합니다.

최상의 결과를 위해 제네릭 HANDLE 형식은 필요한 경우에만 사용해야 합니다.

애플리케이션 내에서 함수 선언

모든 애플리케이션 함수가 선언되었는지 확인합니다. 선언을 쉽게 검색하고 변경해야 하는 매개 변수 및 반환 형식을 찾을 수 있으므로 포함 파일에 모든 함수 선언을 배치하는 것이 좋습니다.

/Zg 컴파일러 옵션을 사용하여 함수에 대한 헤더 파일을 만드는 경우 STRICT 형식 검사를 사용하도록 설정했는지 여부에 따라 다른 결과를 얻을 수 있습니다. STRICT를 사용하지 않도록 설정하면 모든 핸들 형식이 동일한 기본 형식을 생성합니다. STRICT를 사용하도록 설정하면 서로 다른 기본 형식이 생성됩니다. 충돌을 방지하려면 STRICT를 사용하거나 사용하지 않도록 설정할 때마다 헤더 파일을 다시 만들거나 헤더 파일을 편집하여 기본 형식 대신 HWND, HDC, HANDLE 등의 형식을 사용해야 합니다.

Windows.h에서 소스 코드로 복사한 함수 선언이 변경되었을 수 있으며 로컬 선언이 만료되었을 수 있습니다. 로컬 선언을 제거합니다.

캐스트가 필요한 형식

일부 함수에는 제네릭 반환 형식 또는 매개 변수가 있습니다. 예를 들어 SendMessage 함수는 컨텍스트에 따라 여러 형식일 수 있는 데이터를 반환합니다. 소스 코드에 이러한 함수가 표시되면 올바른 형식 캐스트를 사용하고 가능한 한 구체적인지 확인합니다. 다음 목록은 이러한 함수의 예입니다.

SendMessage, DefWindowProc 또는 SendDlgItemMessage를 호출할 때 먼저 결과를 UINT_PTR 형식으로 캐스팅해야 합니다. 결과에 핸들이 포함된 LRESULT 또는 LONG_PTR 값을 반환하는 함수에 대해 유사한 단계를 수행해야 합니다. 이는 Windows 버전에 따라 핸들 크기가 다르기 때문에 이식 가능한 코드를 작성하는 데 필요합니다. (UINT_PTR) 캐스트는 적절한 변환을 보장합니다. 다음 코드는 SendMessage 가 브러시에 대한 핸들을 반환하는 예제를 보여 줍니다.

HBRUSH hbr;

hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);

CreateWindowCreateWindowEx 매개 변수 hmenu는 때때로 정수 컨트롤 식별자(ID)를 전달하는 데 사용됩니다. 이 경우 ID를 HMENU 형식으로 캐스팅해야 합니다.

HWND hwnd;
int id;

hwnd = CreateWindow(
        TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
        x, y, cx, cy, hwndParent,
        (HMENU)id,    // Cast required here
        hinst,
        NULL);

기타 고려 사항

STRICT 형식 검사의 이점을 최대한 활용하려면 따라야 하는 추가 지침이 있습니다. 다음을 변경하는 경우 이후 버전의 Windows에서 코드를 이식할 수 있습니다.

WPARAM, LPARAM, LRESULTLPVOID형식은 다형 데이터 형식입니다. STRICT 형식 검사를 사용하는 경우에도 서로 다른 시간에 다양한 종류의 데이터를 보유합니다. 형식 검사의 이점을 얻으려면 가능한 한 빨리 이러한 형식의 값을 캐스팅해야 합니다. (메시지 크래커가 이식 가능한 방식으로 wParamlParam 을 자동으로 다시 캐스팅합니다.)

HMODULEHINSTANCE 유형을 구분하려면 특별히 주의하세요. STRICT를 사용하도록 설정하더라도 동일한 기본 형식으로 정의됩니다. 대부분의 커널 모듈 관리 함수는 HINSTANCE 형식을 사용하지만 HMODULE 형식만 반환하거나 허용하는 몇 가지 함수가 있습니다.

STRICT 사용 안 림

STRICT 사용