드라이버에 대한 코드 분석 개요
Windows 드라이버 키트는 Microsoft Visual Studio의 코드 분석 도구에 대한 드라이버별 확장을 제공합니다. 드라이버용 코드 분석에는 드라이버, 특히 커널 모드 드라이버에만 적용되는 규칙이 포함되어 있습니다. 드라이버에 대한 코드 분석은 코드를 컴파일하는 즉시 코드에서 잠재적인 오류를 감지할 수 있습니다.
Important
드라이버에 대한 코드 분석은 Windows 24H2 WDK 및 EWDK에서 사용할 수 있지만 나중에 사용 중지되도록 설정되어 있는 것이 좋습니다.
앞으로 CodeQL은 드라이버의 기본 정적 분석 도구가 될 것입니다. CodeQL은 코드를 쿼리할 데이터베이스로 처리하는 강력한 쿼리 언어를 제공하므로 특정 동작, 패턴 등에 대한 쿼리를 간단하게 작성할 수 있습니다.
CodeQL 사용에 대한 자세한 내용은 CodeQL 및 정적 도구 로고 테스트를 참조하세요.
코드 분석 도구의 작동 방식
코드 분석 도구는 Cl.exe 표준 컴파일러에 대한 빌드 유틸리티의 호출을 가로채고 대신 드라이버 소스 코드를 분석하고 오류 및 경고 메시지의 로그 파일을 만드는 CL 인터셉트 컴파일러를 실행합니다. 코드 분석 도구 자체를 실행하거나 드라이버를 빌드할 때 실행되도록 코드 분석 도구를 구성할 수 있습니다. 코드 분석 도구 자체를 실행하면(>솔루션에서 코드 분석 실행 분석) 결과가 코드 분석 보고서 창에 표시됩니다. 빌드의 일부로 코드 분석 도구를 실행하면 CL 인터셉트 컴파일러가 오류 및 경고 메시지의 로그 파일을 만든 다음, 표준 버전의 Cl.exe 호출하여 빌드 출력을 생성합니다. 결과 개체 파일은 표준 빌드 명령에 의해 생성된 파일과 동일합니다.
가로채는 컴파일러가 실행될 때 드라이버용 코드 분석은 코드의 각 함수를 독립적으로 검사한 다음 코드를 통해 가능한 모든 경로의 실행을 시뮬레이션하여 일반적인 드라이버 오류 및 현명하지 못한 코딩 방법을 찾습니다. 코드 분석 도구는 더 큰 드라이버에서도 비교적 빠르게 실행되며, 생성되는 보고서는 의심되는 오류와 함께 드라이버 코드 줄을 정확하게 식별합니다.
코드 분석에서 검색할 수 있는 오류 유형
코드 분석은 다음 범주의 오류를 포함하여 여러 유형의 오류를 검색할 수 있습니다.
메모리: 잠재적인 메모리 누수, 역참조된 NULL 포인터, 초기화되지 않은 메모리에 대한 액세스, 커널 모드 스택의 과도한 사용 및 풀 태그의 부적절한 사용.
리소스: 잠금, 일부 함수를 호출할 때 보유해야 하는 리소스 및 다른 함수를 호출할 때 보유하지 않아야 하는 리소스와 같은 리소스를 해제하지 못했습니다.
함수 사용: 특정 함수의 잠재적으로 잘못된 사용, 올바르지 않은 것으로 보이는 함수 인수, 형식을 엄격하게 확인하지 않는 함수에 대한 가능한 인수 형식 불일치, 사용되지 않는 특정 함수의 사용 가능성, 잠재적으로 잘못된 IRQL에서 함수 호출.
부동 소수점 상태: 드라이버에서 부동 소수점 하드웨어 상태를 보호하지 못하고 다른 IRQL에 저장한 후 부동 소수점 상태를 복원하려고 시도합니다.
우선 순위 규칙: C 프로그래밍의 우선 순위 규칙 때문에 프로그래머가 의도한 대로 동작하지 않을 수 있는 코드입니다.
커널 모드 코딩 방법: 불투명 메모리 설명자 목록(MDL) 구조 수정, 호출된 함수로 설정된 변수 값 검사 실패, Ntstrsafe.h에 정의된 안전한 문자열 함수 대신 C/C++ 문자열 조작 함수 사용 등 오류를 일으킬 수 있는 코딩 방법입니다.
드라이버별 코딩 사례: 커널 모드 드라이버에서 종종 오류의 원인인 특정 작업입니다. 예를 들어 DriverEntry 루틴에서 인수를 복사하는 대신 멤버를 수정하지 않고 전체 IRP(I/O 요청 패킷)를 복사하고 문자열 또는 구조 인수에 대한 포인터를 저장합니다.
코드 분석 경고
코드 분석 도구는 규칙 기반 모델을 사용하여 프로그램 또는 드라이버 코드의 오류를 식별합니다. 각 규칙은 코드 분석 도구가 규칙 위반을 감지하는 경우 보고되는 경고와 연결됩니다. 드라이버별 경고에 대한 자세한 내용은 드라이버 경고에 대한 코드 분석을 참조 하세요. Visual Studio의 코드 분석 도구가 보고하는 핵심 경고 집합에 대한 자세한 내용은 코드 분석 경고를 참조 하세요.
주석
코드 분석 도구에서 제공하는 중요한 기능 중 하나는 드라이버의 소스 코드에서 함수 설명 및 기타 엔터티에 주석을 달 수 있는 기능입니다. 코드 분석 도구에는 기능 내 범위가 있습니다. 즉, 함수 간의 상호 작용을 분석합니다. 주석의 목적은 코드 분석 도구에서 계약이 충족되었는지 확인할 수 있도록 호출된 함수와 호출 함수 간의 계약을 보다 완벽하게 표현하기 위한 것입니다. 주석의 또 다른 목표는 함수를 사용하는 방법과 예상할 수 있는 결과를 코드를 읽는 사람에게 알려주는 것입니다. 주석은 인터페이스의 계약을 선언하고 해당 계약이 달성되는 방법을 설명하려고 시도하지 않습니다. 대부분의 경우 코드 분석 도구를 실행한 결과에서 적절한 주석이 없음을 반영하고 주석을 추가하면 누락된 주석에 대한 경고가 모두 표시되지 않으며 추가 검사가 활성화됩니다. 자세한 내용은 Windows 드라이버용 SAL 2.0 주석을 참조 하세요. SAL 2.0에 대한 자세한 내용은 SAL 주석을 사용하여 C/C++ 코드 결함을 줄이는 방법을 참조 하세요. SAL 2.0은 SAL 1.0을 대체합니다. SAL 2.0은 Windows 8용 WDK와 함께 사용해야 합니다. 드라이버용 SAL 1.0에 대한 정보가 필요한 경우 Windows 7용 WDK와 함께 제공된 PREfast for Drivers 주석 설명서를 참조하세요.
결과 해석
드라이버에 대한 코드 분석은 실행하기 쉽고 매우 큰 드라이버 및 프로그램에서도 빠르게 실행됩니다. 개발자를 위한 작업은 출력을 검사하고, 코드 분석 도구에서 감지한 오류를 분석하고, 코드 분석 도구가 잘못 해석한 유효한 코드와 실제 코딩 오류를 구분하는 것입니다.
코드 분석 도구에서 검색할 수 있는 각 경고를 설명하는 포괄적인 참조는 드라이버 경고에 대한 코드 분석을 참조 하세요. Visual Studio의 코드 분석 도구가 보고하는 핵심 경고 집합에 대한 자세한 내용은 코드 분석 경고를 참조 하세요.
코드 분석 경고를 해결하려면 일반적으로 적절한 경우 소스 코드를 업데이트하거나 주석을 추가하여 함수 계약을 명확히 해야 합니다. 주석을 추가하면 분석기에서 향후 모든 호출자에 대한 계약을 적용할 수 있으며 가독성도 향상됩니다.
코드 분석 결과에 주의 깊게 검사한 후 잘못된 것으로 판단되는 오류가 표시되고 주석을 사용하는 경우에도 방지할 수 없는 경우 이러한 경고를 제외하거나 표시하지 않도록 선택할 수 있습니다. 자세한 내용은 드라이버에 대한 코드 분석을 실행하는 방법을 참조 하세요.