정적 및 동적 확인 도구

다음과 같은 두 가지 기본 유형의 확인 도구가 있습니다.

  • 정적 확인 도구 는 드라이버를 실행하지 않고 드라이버 코드를 검사합니다. 이러한 도구는 코드를 연습하는 테스트에 의존하지 않으므로 매우 철저할 수 있습니다. 이론적으로 정적 확인 도구는 실제로 거의 실행되지 않는 코드 경로를 포함하여 모든 드라이버 코드를 검사할 수 있습니다. 그러나 드라이버가 실제로 실행되고 있지 않으므로 가양성 결과를 생성할 수 있습니다. 즉, 실제로 발생하지 않을 수 있는 코드 경로에서 오류를 보고할 수 있습니다.

  • 동적 확인 도구 는 드라이버가 실행되는 동안 일반적으로 일반적으로 사용되는 드라이버 지원 루틴에 대한 호출을 가로채고 동일한 루틴의 자체 오류 검사 버전에 대한 호출을 대체하여 드라이버 코드를 검사합니다. 동적 도구가 확인을 수행하는 동안 드라이버가 실제로 실행 중이므로 가양성 결과는 거의 없습니다. 그러나 동적 도구는 드라이버를 모니터링하는 동안 발생하는 작업만 감지하기 때문에 드라이버 테스트 적용 범위가 적절하지 않은 경우 도구에서 특정 드라이버 결함을 놓칠 수 있습니다. 동시에 소스 코드에서 정적으로 추출하기 어려운 정보와 같이 런타임에 사용할 수 있는 정보를 사용하여 동적 확인 도구는 정적 분석 도구로 검색하기 어려운 특정 클래스의 드라이버 오류를 검색할 수 있습니다.

정적 및 동적 확인 도구의 조합을 사용하는 것이 가장 좋습니다. 정적 도구를 사용하면 실제로 실행하기 어려운 코드 경로를 확인할 수 있으며 동적 도구는 드라이버에서 발생하는 심각한 오류를 찾을 수 있습니다.

Important

Windows 하드웨어 호환성 프로그램에는 클라이언트 및 서버 운영 체제에서 STL(정적 도구 로고) 테스트용 CodeQL이 필요합니다. 우리는 이전 제품에 대한 SDV 및 CA에 대한 지원을 계속 유지합니다. 파트너는 정적 도구 로고 테스트에 대한 CodeQL 요구 사항을 검토하는 것이 좋습니다. CodeQL 사용에 대한 자세한 내용은 CodeQL 및 정적 도구 로고 테스트를 참조하세요.

확인 도구 설문 조사

다음 확인 도구는 WDK에 설명되어 있으며 드라이버 개발자 및 테스터가 사용하는 것이 좋습니다. 일반적으로 사용되는 순서대로 나열됩니다.

코드가 컴파일되는 즉시

  • GitHub의 CodeQL은 강력한 의미 체계 코드 분석 엔진이며, 강력한 플랫폼과 함께 광범위한 고부가가치 보안 쿼리 제품군을 조합하여 드라이버 코드를 보호하는 데 매우 유용한 도구입니다. 자세한 내용은 CodeQL 및 정적 도구 로고 테스트를 참조하세요.

추가 정적 도구

드라이버를 빌드하는 Windows 버전에 따라 다른 정적 도구가 필요할 수 있습니다.

  • 드라이버 에 대한 코드 분석은 컴파일 시간에 실행되는 정적 확인 도구입니다. 드라이버에 대한 코드 분석은 C/C++ 및 관리 코드로 작성된 드라이버를 확인할 수 있습니다. 드라이버를 빌드하는 즉시 실행할 수 있도록 드라이버의 각 함수에서 코드를 독립적으로 검사합니다. 비교적 빠르게 실행되며 몇 가지 리소스를 사용합니다.

    Visual Studio의 코드 분석 도구의 기본 기능은 반환 값을 확인하지 않는 것과 같은 일반적인 코딩 오류를 검색합니다. 드라이버별 기능은 복사된 IRP에 초기화되지 않은 필드를 그대로 두고 루틴이 끝날 때까지 변경된 IRQL을 복원하지 못하는 등 더 미묘한 드라이버 코딩 오류를 감지합니다.

  • SDV(정적 드라이버 검증 도구 )는 컴파일 시간에 실행되고 C/C++로 작성된 커널 모드 드라이버 코드를 확인하는 정적 확인 도구입니다. WDK에 포함되며 Visual Studio Ultimate 2012 또는 MSBuild를 사용하여 Visual Studio 명령 프롬프트 창에서 시작할 수 있습니다.

    정적 드라이버 검증 도구는 일련의 인터페이스 규칙 및 운영 체제 모델에 따라 드라이버가 Windows 운영 체제 커널과 제대로 상호 작용하는지 여부를 결정합니다. 정적 드라이버 검증 도구는 매우 철저합니다. 드라이버 소스 코드에서 연결할 수 있는 모든 경로를 탐색하고 상징적으로 실행합니다. 따라서 기존의 다른 드라이버 테스트 방법을 사용하여 검색되지 않는 버그를 찾습니다.

Important

SDV는 더 이상 지원되지 않으며 Windows 24H2 WDK 또는 EWDK 릴리스에서는 SDV를 사용할 수 없습니다. 빌드 26017보다 최신의 WDK에서는 사용할 수 없으며 Windows 24H2 RTM WDK에는 포함되지 않습니다. SDV는 WDK(Windows 드라이버 키트) 다운로드에서 Visual Studio 빌드 도구 17.1.5와 함께 Windows 11 버전 22H2 EWDK(2023년 10월 24일 릴리스)를 다운로드하여 계속 사용할 수 있습니다. SDV를 실행하는 데 엔터프라이즈 WDK만 사용하는 것이 좋습니다. 최신 버전의 Visual Studio와 함께 표준 WDK의 이전 버전을 사용하는 것은 권장되지 않습니다. 따라서 분석 실패가 발생할 수 있습니다.
앞으로 CodeQL은 드라이버의 기본 정적 분석 도구가 될 것입니다. CodeQL은 코드를 쿼리할 데이터베이스로 처리하는 강력한 쿼리 언어를 제공하므로 특정 동작, 패턴 등에 대한 쿼리를 간단하게 작성할 수 있습니다. CodeQL 사용에 대한 자세한 내용은 CodeQL 및 정적 도구 로고 테스트를 참조하세요.

드라이버가 실행되는 경우

드라이버가 빌드되고 명백한 오류 없이 실행되는 즉시 다음 동적 확인 도구를 사용합니다.

  • 드라이버 검증 도구 는 특히 Windows 드라이버용으로 작성된 동적 확인 도구입니다. 여기에는 여러 드라이버에서 동시에 실행할 수 있는 여러 테스트가 포함됩니다. 드라이버 검증 도구는 드라이버 개발자와 테스터가 드라이버가 개발 또는 테스트 환경에서 실행될 때마다 실행되도록 드라이버 검증 도구를 구성하는 드라이버에서 심각한 버그를 찾는 데 매우 효과적입니다. 드라이버 검증 도구는 Windows에 포함되어 있습니다. 드라이버에 대해 드라이버 검증 도구를 사용하도록 설정하는 경우 드라이버에서 여러 테스트를 실행해야 합니다. 드라이버 검증 도구는 정적 확인 도구만 사용하여 감지하기 어려운 특정 드라이버 버그를 검색할 수 있습니다. 이러한 유형의 버그의 예는 다음과 같습니다.

    • 커널 풀 버퍼 오버런. 확인된 드라이버가 풀 메모리 버퍼를 할당하면 드라이버 검증 도구는 액세스할 수 없는 메모리 페이지로 보호합니다. 드라이버가 버퍼의 끝을 지나 메모리를 사용하려고 하면 드라이버 검증 도구에서 버그 검사를 실행합니다.

    • 메모리를 해제한 후 사용 특수 풀 메모리 블록은 자체 메모리 페이지를 사용하며 메모리 페이지를 다른 할당과 공유하지 않습니다. 드라이버가 풀 메모리 블록을 해제하면 해당 메모리 페이지에 액세스할 수 없게 됩니다. 드라이버가 메모리를 해제한 후 해당 메모리를 사용하려고 하면 드라이버가 즉시 충돌합니다.

    • 관리자 권한 IRQL에서 실행하는 동안 페이지 가능 메모리 사용 확인된 드라이버가 DISPATCH_LEVEL 이상에서 IRQL을 발생시키는 경우 드라이버 검증 도구는 시스템 작업 집합에서 모든 페이징 가능한 메모리를 트리밍하여 메모리 부족 상태에서 시스템을 시뮬레이션합니다. 이러한 페이즈 가능한 가상 주소 중 하나를 사용하려고 하면 드라이버가 충돌합니다.

    • 낮은 리소스 시뮬레이션. 낮은 리소스 조건에서 시스템을 시뮬레이션하기 위해 드라이버 검증 도구는 드라이버에서 호출하는 다양한 운영 체제 커널 API에 실패할 수 있습니다.

    • 메모리 누수. 드라이버 검증 도구는 드라이버에서 수행한 메모리 할당을 추적하고 드라이버가 언로드되기 전에 메모리가 해제되었는지 확인합니다.

    • 완료하거나 취소하는 데 너무 많은 시간이 걸리는 I/O 작업입니다. 드라이버 검증 도구는 IoCallDriver에서 STATUS_PENDING 반환 값에 응답하기 위해 드라이버의 논리를 테스트할 수 있습니다.

    • DDI 규정 준수 검사. (Windows 8부터 사용 가능) 드라이버 검증 도구는 드라이버와 운영 체제의 커널 인터페이스 간의 적절한 상호 작용을 확인하는 DDI(디바이스 드라이버 인터페이스) 규칙 집합을 적용합니다. 이러한 규칙은 정적 드라이버 검증 도구가 드라이버 소스 코드를 분석하는 데 사용하는 규칙에 해당합니다. DDI 준수 검사를 사용할 때 드라이버 검증 도구에서 오류를 발견하면 정적 드라이버 검증 도구를 실행하고 오류를 발생시킨 것과 동일한 규칙을 선택합니다. 정적 드라이버 검증 도구는 드라이버 소스 코드에서 결함의 원인을 찾는 데 도움이 될 수 있습니다.

  • 애플리케이션 검증 도구 는 C/C++로 작성된 사용자 모드 애플리케이션 및 드라이버를 위한 동적 확인 도구입니다. 관리 코드를 확인하지 않습니다.