Ferramentas de verificação estática e dinâmica
Existem dois tipos básicos de ferramentas de verificação:
As ferramentas de verificação estática examinam o código do driver sem executar o driver. Como essas ferramentas não dependem de testes que exercitam o código, elas podem ser extremamente completas. Teoricamente, as ferramentas de verificação estática podem examinar todo o código do driver, incluindo caminhos de código que raramente são executados na prática. No entanto, como o driver não está realmente em execução, eles podem gerar resultados falso-positivos. Ou seja, eles podem relatar um erro em um caminho de código que pode não ocorrer na prática.
As ferramentas de verificação dinâmica examinam o código do driver enquanto o driver está em execução, normalmente interceptando chamadas para rotinas de suporte ao driver comumente usadas e substituindo chamadas por suas próprias versões de verificação de erros das mesmas rotinas. Como o driver está realmente em execução enquanto as ferramentas dinâmicas estão fazendo a verificação, os resultados falso-positivos são raros. No entanto, como as ferramentas dinâmicas detectam apenas as ações que ocorrem enquanto estão monitorando o driver, as ferramentas podem perder determinados defeitos de driver se a cobertura de teste de driver não for adequada. Ao mesmo tempo, usando informações disponíveis em tempo de execução, por exemplo, informações que são mais difíceis de extrair estaticamente do código-fonte, as ferramentas de verificação dinâmica podem detectar certas classes de erros de driver que são mais difíceis de detectar com ferramentas de análise estática.
A prática recomendada é usar uma combinação de ferramentas de verificação estática e dinâmica. As ferramentas estáticas permitem que você verifique caminhos de código que são difíceis de exercitar na prática, enquanto as ferramentas dinâmicas encontram erros graves que estão ocorrendo no driver.
Importante
O Programa de Compatibilidade de Hardware do Windows requer o CodeQL para Teste de Logotipo de Ferramentas Estáticas (STL) em nossos sistemas operacionais cliente e servidor. Continuaremos mantendo o suporte para SDV e CA em produtos mais antigos. Os parceiros são altamente encorajados a analisar os requisitos do CodeQL para o Teste de Logotipo de Ferramentas Estáticas. Para obter mais informações sobre como usar o CodeQL, consulte CodeQL e o teste de logotipo de ferramentas estáticas.
Levantamento de ferramentas de verificação
As ferramentas de verificação a seguir são descritas no WDK e recomendadas para uso por desenvolvedores e testadores de driver. Eles são listados na ordem em que são normalmente usados.
Assim que o código for compilado
- CodeQL, do GitHub, é um poderoso mecanismo de análise de código semântico e uma combinação de um vasto conjunto de consultas de segurança de alto valor com uma plataforma robusta, que o tornam uma ferramenta inestimável para proteger o código dos drivers. Para obter mais informações, consulte CodeQL e o teste de logotipo de ferramentas estáticas.
Ferramentas estáticas adicionais
Dependendo da versão do Windows a partir da qual você está criando um driver, outras ferramentas estáticas podem ser necessárias.
A Análise de Código para Drivers é uma ferramenta de verificação estática que é executada em tempo de compilação. A Análise de Código para Drivers pode verificar drivers escritos em C/C++ e código gerenciado. Ele examina o código em cada função de um driver de forma independente, para que você possa executá-lo assim que puder criar seu driver. Ele é executado de forma relativamente rápida e usa poucos recursos.
Os recursos básicos da ferramenta Análise de Código no Visual Studio detectam erros gerais de codificação, como não verificar valores retornados. Os recursos específicos do driver detectam erros de codificação de driver mais sutis, como deixar campos não inicializados em um IRP copiado e não restaurar um IRQL alterado até o final de uma rotina.
O SDV (Verificador de Driver Estático) é uma ferramenta de verificação estática que é executada em tempo de compilação e verifica o código do driver no modo kernel escrito em C/C++. Ele está incluído no WDK e pode ser iniciado no Visual Studio Ultimate 2012 ou em uma janela de prompt de comando do Visual Studio usando o MSBuild.
Com base em um conjunto de regras de interface e um modelo do sistema operacional, o Verificador de Driver Estático determina se o driver interage corretamente com o kernel do sistema operacional Windows. O Verificador de Driver Estático é extremamente completo - ele explora todos os caminhos acessíveis no código-fonte do driver e os executa simbolicamente. Como tal, ele encontra bugs que não são detectados usando nenhum outro método convencional de teste de driver.
Importante
Não há mais suporte para SDV e SDV não está disponível em Windows 24H2 WDK ou EWDK versões. Ele não está disponível em WDKs mais recentes que o build 26017 e não está incluído no WDK Windows 24H2 RTM.
O SDV ainda pode ser usado baixando o Windows 11, versão 22H2 EWDK (lançado em 24 de outubro de 2023) com as ferramentas de build do Visual Studio 17.1.5 em Baixar o WDK (Windows Driver Kit). Somente o uso do Enterprise WDK para executar o SDV é recomendado. O uso de versões mais antigas do WDK padrão em conjunto com versões recentes do Visual Studio não é recomendado, pois isso provavelmente resultará em falhas de análise.
No futuro, o CodeQL será a principal ferramenta de análise estática para motoristas. O CodeQL fornece uma linguagem de consulta poderosa que trata o código como um banco de dados a ser consultado, simplificando a gravação de consultas para comportamentos específicos, padrões e muito mais.
Para obter mais informações sobre como usar o CodeQL, consulte CodeQL e o teste de logotipo de ferramentas estáticas.
Quando o driver é executado
Use as seguintes ferramentas de verificação dinâmica assim que o driver for criado e estiver em execução sem erros óbvios.
O Verificador de Driver é uma ferramenta de verificação dinâmica escrita especialmente para drivers do Windows. Inclui vários testes que podem ser executados em vários drivers simultaneamente. O Verificador de Driver é tão eficaz em encontrar bugs sérios em drivers que desenvolvedores e testadores de driver experientes configuram o Verificador de Driver para ser executado sempre que o driver for executado em um ambiente de desenvolvimento ou teste. O Driver Verifier é fornecido com o Windows. Ao habilitar o Verificador de Driver para um driver, você também deve executar vários testes no driver. O Verificador de Driver pode detectar determinados bugs de driver que são difíceis de detectar usando apenas ferramentas de verificação estática. Exemplos desses tipos de bugs incluem o seguinte:
Saturações de buffer do pool de kernels. Quando o driver verificado aloca buffers de memória de pool, o Verificador de Driver os protege com uma página de memória não acessível. Se o driver tentar usar a memória após o final do buffer, o Verificador de Driver emitirá uma verificação de bug.
Usando memória depois de liberá-la. Os blocos de memória de pool especiais usam sua própria página de memória e não compartilham páginas de memória com outras alocações. Quando o driver está liberando o bloco de memória do pool, a página de memória correspondente se torna inacessível. Se o driver tentar usar essa memória depois de liberá-la, o driver falhará instantaneamente.
Usando memória paginável durante a execução em IRQL elevado. Quando um driver verificado aumenta o IRQL em DISPATCH_LEVEL ou superior, o Verificador de Driver corta toda a memória paginável do conjunto de trabalho do sistema, simulando um sistema sob pressão de memória. O driver falha se tentar usar um desses endereços virtuais pagináveis.
Simulação de Baixos Recursos. Para simular um sistema em condições de poucos recursos, o Verificador de Driver pode falhar em várias APIs de kernel do sistema operacional chamadas por drivers.
Vazamentos de memória. O Verificador de Driver rastreia as alocações de memória feitas por um driver e garante que a memória seja liberada antes que o driver seja descarregado.
Operações de E/S que levam muito tempo para serem concluídas ou canceladas. O Verificador de Driver pode testar a lógica do driver para responder a STATUS_PENDING valores retornados de IoCallDriver.
Verificação de conformidade com DDI. (Disponível a partir do Windows 8) O Verificador de Driver aplica um conjunto de regras de DDI (interface de driver de dispositivo) que verificam a interação adequada entre um driver e a interface do kernel do sistema operacional. Essas regras correspondem às regras que o Verificador de Driver Estático usa na análise do código-fonte do driver. Se o Verificador de Driver encontrar um erro quando a Verificação de Conformidade de DDI estiver habilitada, execute o Verificador de Driver Estático e selecione a mesma regra que causou o erro. O Verificador de Driver Estático pode ajudá-lo a localizar a causa do defeito no código-fonte do driver.
O Kasaner (Kernel Address Sanitizer ) é uma tecnologia de detecção de bugs com suporte em drivers Windows que permite detectar várias classes de acessos ilegais à memória, como estouros de buffer e eventos de uso após liberação.
O Verificador de Aplicativos é uma ferramenta de verificação dinâmica para aplicativos e drivers no modo de usuário escritos em C/C++. Ele não verifica o código gerenciado.