드라이버에 대한 코드 분석 개요

Windows 드라이버 키트는 Microsoft Visual Studio의 코드 분석 도구 에 대한 드라이버별 확장을 제공합니다. 드라이버에 대한 코드 분석에는 드라이버, 특히 커널 모드 드라이버에만 적용되는 규칙이 포함되어 있습니다. 드라이버용 코드 분석은 코드를 컴파일하는 즉시 코드에서 잠재적 오류를 검색할 수 있습니다.

코드 분석 도구의 작동 방식

코드 분석 도구는 Cl.exe 표준 컴파일러에 대한 빌드 유틸리티의 호출을 가로채고 대신 드라이버 소스 코드를 분석하고 오류 및 경고 메시지의 로그 파일을 만드는 CL 인터셉트 컴파일러를 실행합니다. 코드 분석 도구 자체를 실행하거나 드라이버를 빌드할 때 실행되도록 코드 분석 도구를 구성할 수 있습니다. 코드 분석 도구 자체(솔루션에서 코드 분석 실행 분석>)를 실행하면 결과가 코드 분석 보고서 창에 표시됩니다. 코드 분석 도구를 빌드의 일부로 실행하는 경우 CL 인터셉트 컴파일러는 오류 및 경고 메시지의 로그 파일을 만든 다음 표준 버전의 Cl.exe 호출하여 빌드 출력을 생성합니다. 결과 개체 파일은 표준 빌드 명령에 의해 생성된 파일과 동일합니다.

가로채는 컴파일러가 실행되면 드라이버용 코드 분석은 코드의 각 함수를 독립적으로 검사한 다음 코드를 통해 가능한 모든 경로의 실행을 시뮬레이션하여 일반적인 드라이버 오류 및 현명하지 못한 코딩 방법을 찾습니다. 코드 분석 도구는 더 큰 드라이버에서도 비교적 빠르게 실행되며, 생성되는 보고서는 의심되는 오류로 드라이버 코드 줄을 정확하게 식별합니다.

코드 분석에서 검색할 수 있는 오류 유형

코드 분석은 다음 범주의 오류를 포함하여 여러 유형의 오류를 검색할 수 있습니다.

  • 메모리: 잠재적인 메모리 누수, 역참조된 NULL 포인터, 초기화되지 않은 메모리에 대한 액세스, 커널 모드 스택의 과도한 사용 및 풀 태그의 부적절한 사용.

  • 리소스: 잠금, 일부 함수를 호출할 때 보유해야 하는 리소스 및 다른 함수를 호출할 때 보유하지 않아야 하는 리소스와 같은 리소스를 해제하지 못했습니다.

  • 함수 사용: 특정 함수의 잠재적으로 잘못된 사용, 올바르지 않은 것처럼 보이는 함수 인수, 형식을 엄격하게 검사 않는 함수에 대한 가능한 인수 형식 불일치, 사용되지 않는 특정 함수의 사용 가능성 및 잠재적으로 잘못된 IRQL에서 함수 호출.

  • 부동 소수점 상태: 드라이버에서 부동 소수점 하드웨어 상태를 보호하지 못하고 다른 IRQL에 저장한 후 부동 소수점 상태를 복원하려고 시도합니다.

  • 우선 순위 규칙: C 프로그래밍의 우선 순위 규칙 때문에 프로그래머가 의도한 대로 작동하지 않을 수 있는 코드입니다.

  • 커널 모드 코딩 사례: 불투명 메모리 설명자 목록(MDL) 구조 수정, 호출된 함수로 설정된 변수 값 검사 실패, Ntstrsafe.h에 정의된 안전한 문자열 함수 대신 C/C++ 문자열 조작 함수 사용 등 오류를 일으킬 수 있는 코딩 방식입니다.

  • 드라이버별 코딩 사례: 커널 모드 드라이버에서 종종 오류의 원본인 특정 작업입니다. 예를 들어 DriverEntry 루틴에서 인수를 복사하는 대신 멤버를 수정하지 않고 전체 IRP(I/O 요청 패킷)를 복사하고 문자열 또는 구조체 인수에 대한 포인터를 저장합니다.

코드 분석 경고

코드 분석 도구는 규칙 기반 모델을 사용하여 프로그램 또는 드라이버 코드의 오류를 식별합니다. 각 규칙은 코드 분석 도구가 규칙 위반을 감지하는 경우 보고되는 경고와 연결됩니다. 드라이버별 경고에 대한 자세한 내용은 드라이버 경고에 대한 코드 분석을 참조하세요. Visual Studio의 코드 분석 도구가 보고하는 핵심 경고 집합에 대한 자세한 내용은 코드 분석 경고를 참조하세요.

주석

코드 분석 도구에서 제공하는 중요한 기능 중 하나는 드라이버의 소스 코드에서 함수 설명 및 기타 엔터티에 주석을 달 수 있는 기능입니다. 코드 분석 도구에는 기능 내 scope 있습니다. 즉, 함수 간의 상호 작용을 분석합니다. 주석의 목적은 코드 분석 도구가 계약을 충족하도록 검사 수 있도록 호출된 함수와 호출 함수 간의 계약을 보다 완벽하게 표현하기 위한 것입니다. 주석의 또 다른 목표는 코드를 읽는 사람에게 함수를 사용해야 하는 방법과 예상할 수 있는 결과를 알려주는 것입니다. 주석은 인터페이스의 계약을 선언하고 해당 계약이 달성되는 방법을 설명하려고 시도하지 않습니다. 대부분의 경우 코드 분석 도구를 실행한 결과는 적절한 주석이 없음을 반영하고 주석을 추가하면 누락된 주석에 대한 경고가 모두 표시되지 않으며 추가 검사가 사용하도록 설정됩니다. 자세한 내용은 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의 코드 분석 도구가 보고하는 핵심 경고 집합에 대한 자세한 내용은 코드 분석 경고를 참조하세요.

코드 분석 경고를 해결하려면 일반적으로 적절한 경우 소스 코드를 업데이트하거나 주석을 추가하여 함수 계약을 명확히 해야 합니다. 주석을 추가하면 분석기가 모든 이후 호출자에 대한 계약을 적용할 수 있으며 가독성도 향상됩니다.

코드 분석 결과에 주의 깊게 검사한 후 잘못된 오류가 표시되고 주석을 사용하는 경우에도 피할 수 없는 오류가 표시되면 이러한 경고를 제외하거나 표시하지 않도록 선택할 수 있습니다. 자세한 내용은 드라이버에 대한 코드 분석을 실행하는 방법을 참조하세요.

드라이버에 대한 코드 분석을 실행하는 방법

Visual Studio의 코드 분석 도구

드라이버 경고에 대한 코드 분석

코드 분석 경고

Windows 드라이버용 SAL 2.0 주석