Обзор анализа кода для драйверов
Пакет драйверов Windows предоставляет расширение для конкретного драйвера для средства анализа кода в Microsoft Visual Studio. Анализ кода для драйверов включает правила, которые применяются только к драйверам, особенно драйверам в режиме ядра. Анализ кода для драйверов может обнаруживать потенциальные ошибки в коде сразу после компиляции кода.
Внимание
Анализ кода для драйверов доступен в Windows 24H2 WDK и EWDK, но следует рекомендовать, что он будет снят в будущем.
В будущем CodeQL будет основным средством статического анализа драйверов. CodeQL предоставляет мощный язык запросов, который обрабатывает код как базу данных для запроса, что упрощает запись запросов для конкретных поведения, шаблонов и многого другого.
Дополнительные сведения об использовании CodeQL см. в разделе CodeQL и проверка логотипа статических инструментов.
Как работает средство анализа кода
Средство анализа кода перехватывает вызов программы сборки стандартному компилятору, Cl.exe и, вместо этого, запускает компилятор перехвата CL, который анализирует исходный код драйвера и создает файл журнала ошибок и предупреждений. Вы можете запустить средство анализа кода самостоятельно или настроить средство анализа кода для выполнения при сборке драйвера. При запуске средства анализа кода самостоятельно (анализ > анализа кода в решении) результаты отображаются в окне отчета анализа кода. При запуске средства анализа кода в рамках сборки компилятор перехвата cl создает файл журнала сообщений об ошибках и предупреждениях, а затем вызывает стандартную версию Cl.exe для создания выходных данных сборки. Полученные файлы объектов совпадают с файлами, созданными стандартной командой сборки.
При выполнении перехвата компилятора анализ кода для драйверов проверяет каждую функцию в коде независимо, а затем имитирует выполнение всех возможных путей через код, ищет распространенные ошибки драйвера и неразумные методы написания кода. Средство анализа кода выполняется относительно быстро, даже на более крупных драйверах, и отчет, который он создает точно идентифицирует строку кода драйвера с предполагаемой ошибкой.
Типы анализа кода ошибок могут обнаруживать
Анализ кода может обнаруживать несколько типов ошибок, включая ошибки в следующих категориях:
Память: потенциальные утечки памяти, разыменовытые указатели NULL , доступ к неинициализированной памяти, чрезмерное использование стека режима ядра и неправильное использование тегов пула.
Ресурсы. Не удается освободить такие ресурсы, как блокировки, ресурсы, которые должны храниться при вызове некоторых функций и ресурсов, которые не должны храниться при вызове других функций.
Использование функции: потенциально неправильное использование определенных функций, аргументов функций, которые отображаются неправильно, возможные несоответствия типов аргументов для функций, которые не проверяют типы, возможные использование некоторых устаревших функций и вызовы функций при потенциально неправильном IRQL.
Состояние с плавающей запятой: не удалось защитить состояние оборудования с плавающей запятой в драйвере и попытаться восстановить состояние с плавающей запятой после сохранения его в другом IRQL.
Правила приоритета: код, который не может вести себя как программист, предназначенный из-за правил приоритета программирования C.
Методы написания кода в режиме ядра: методы программирования, которые могут привести к ошибкам, таким как изменение непрозрачной структуры списка дескрипторов памяти (MDL), не удается проверить значение переменной, заданной вызываемой функцией, и использовать функции обработки строк C/C++, а не безопасные строковые функции, определенные в Ntstrsafe.h.
Рекомендации по программированию для конкретного драйвера: конкретные операции, которые часто являются источником ошибок в драйверах режима ядра. Например, копирование всего пакета запросов ввода-вывода (IRP) без изменения элементов и сохранения указателя на аргумент строки или структуры вместо копирования аргумента в подпрограмме DriverEntry .
Предупреждения анализа кода
Средство анализа кода использует модель на основе правил для выявления ошибок в коде программы или драйвера. Каждое правило связано с предупреждением, которое сообщается, если средство анализа кода обнаруживает нарушение правила. Подробные сведения о предупреждениях, относящихся к драйверу, см. в разделе "Анализ кода для предупреждений драйверов". Сведения о базовом наборе предупреждений, которые средство анализа кода в отчетах Visual Studio содержится в предупреждениях анализа кода.
Заметки
Одним из важных возможностей, которые предоставляет средство анализа кода, является возможность аннотировать описания функций и некоторые другие сущности в исходном коде драйвера. Средство анализа кода имеет внутрифункциональную область; т. е. анализирует взаимодействие между функциями. Цель заметок заключается в том, чтобы обеспечить более полное выражение контракта между вызываемых и вызывающими функциями, чтобы инструмент анализа кода смог проверить, выполнен ли контракт. Другая цель примечаний заключается в том, что они сообщают, кто читает код, как следует использовать функцию и какие результаты можно ожидать. Заметки объявляют контракт интерфейса и не пытаются описать, как достигается этот контракт. Во многих случаях результаты выполнения средства анализа кода отражают отсутствие соответствующей заметки и добавление заметки, как предупреждение о отсутствующей заметке, так и дополнительные проверки включены. Дополнительные сведения см. в заметках SAL 2.0 для драйверов Windows. Дополнительные сведения о SAL 2.0 см. в статье "Использование заметок SAL для уменьшения дефектов кода C/C++". SAL 2.0 заменяет SAL 1.0. SAL 2.0 следует использовать с WDK для Windows 8. Если вам нужна информация о SAL 1.0 для драйверов, ознакомьтесь с документацией PREfast для драйверов, которая поставляется с WDK для Windows 7.
Интерпретация результата
Анализ кода для драйверов легко выполняться, и он выполняется быстро, даже на очень больших драйверах и программах. Работа разработчика заключается в анализе выходных данных, анализе ошибок, обнаруженных средством анализа кода, и различии реальных ошибок кодирования от допустимого кода, который средство анализа кода неправильно интерпретирует.
Полный справочник, описывающий каждое предупреждение, которое может обнаружить средство анализа кода, см. в разделе "Анализ кода для предупреждений драйверов". Сведения о базовом наборе предупреждений, которые средство анализа кода в отчетах Visual Studio содержится в предупреждениях анализа кода.
Разрешение предупреждения анализа кода обычно включает обновление исходного кода при необходимости или добавление заметки для уточнения контракта функции. Добавление заметки позволяет анализатору применять контракт для всех будущих вызывающих пользователей, а также улучшает удобочитаемость.
Если в результатах анализа кода отображаются ошибки, которые определяются после тщательного изучения, недопустимы и их нельзя избежать даже при использовании заметок, вы можете исключить или отключить эти предупреждения. Дополнительные сведения см. в разделе "Запуск анализа кода для драйверов".
См. также
Запуск анализа кода для драйверов
Средство анализа кода в Visual Studio