Visão geral da Análise de código para drivers

O Kit de Driver do Windows fornece uma extensão específica do driver para a ferramenta de análise de código no Microsoft Visual Studio. A Análise de Código para Drivers inclui regras que se aplicam somente a drivers, particularmente drivers de modo kernel. A Análise de Código para Drivers pode detectar possíveis erros em seu código assim que o código puder ser compilado.

Importante

A Análise de Código para drivers está disponível no WDK e EWDK do Windows 24H2, mas esteja ciente de que ela está definida para ser desativada em uma data futura.
No futuro, o CodeQL será a principal ferramenta de análise estática para drivers. 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, padrões e muito mais específicos. Para obter mais informações sobre como usar o CodeQL, consulte CodeQL e o teste de logotipo de ferramentas estáticas.

Como funciona a ferramenta de análise de código

A ferramenta Análise de Código intercepta a chamada do utilitário de compilação para o compilador padrão e, Cl.exe em vez disso, executa um compilador de interceptação CL que analisa o código-fonte do driver e cria um arquivo de log de mensagens de erro e aviso. Você pode executar a ferramenta de análise de código por si só ou você pode configurar a ferramenta de análise de código para ser executada quando você compilar seu driver. Quando você executa a ferramenta de análise de código por si só (Analisar > , executar análise de código na solução), os resultados aparecem na janela Relatório de análise de código. Quando você executa a ferramenta de análise de código como parte da compilação, o compilador de interceptação CL cria um arquivo de log de mensagens de erro e aviso e, em seguida, chama a versão padrão do Cl.exe para produzir a saída da compilação. Os arquivos de objeto resultantes são os mesmos produzidos por um comando de compilação padrão.

Quando o compilador de interceptação é executado, a Análise de Código para Drivers examina cada função no código independentemente e, em seguida, simula a execução de todos os caminhos possíveis através do código, procurando erros comuns de driver e práticas de codificação imprudentes. A ferramenta de análise de código é executada relativamente rapidamente, mesmo em drivers maiores, e o relatório que ela gera identifica precisamente a linha de código do driver com o erro suspeito.

Os tipos de erros que a Análise de Código pode detectar

A Análise de Código pode detectar vários tipos de erros, incluindo erros nas seguintes categorias:

  • Memória: Possíveis vazamentos de memória, ponteiros NULL desreferenciados, acesso à memória não inicializada, uso excessivo da pilha de modo kernel e uso inadequado de tags de pool.

  • Recursos: falha ao liberar recursos como bloqueios, recursos que devem ser mantidos ao chamar algumas funções e recursos que não devem ser mantidos ao chamar outras funções.

  • Uso da função: Uso potencialmente incorreto de determinadas funções, argumentos de função que parecem incorretos, possíveis incompatibilidades de tipo de argumento para funções que não verificam estritamente os tipos, possível uso de certas funções obsoletas e chamadas de função em um IRQL potencialmente incorreto.

  • Estado de ponto flutuante: falha ao proteger o estado de hardware de ponto flutuante em um driver e tentativa de restaurar o estado de ponto flutuante depois de salvá-lo em um IRQL diferente.

  • Regras de precedência: Código que pode não se comportar como o programador pretendia devido às regras de precedência da programação C.

  • Práticas de codificação no modo kernel: práticas de codificação que podem causar erros, como modificar uma estrutura de lista de descritores de memória opaca (MDL), não examinar o valor de uma variável definida por uma função chamada e usar funções de manipulação de cadeia de caracteres C/C++ em vez das funções de cadeia de caracteres seguras definidas em Ntstrsafe.h.

  • Práticas de codificação específicas do driver: operações específicas que geralmente são uma fonte de erros em drivers de modo kernel. Por exemplo, copiar um pacote de solicitação de E/S (IRP) inteiro sem modificar membros e salvar um ponteiro em uma cadeia de caracteres ou argumento de estrutura em vez de copiar um argumento em uma rotina DriverEntry .

Avisos de análise de código

A ferramenta Análise de código usa um modelo baseado em regras para identificar erros no código do programa ou driver. Cada regra é associada a um aviso que é relatado se a ferramenta Análise de Código detectar uma violação da regra. Para obter informações detalhadas sobre os avisos específicos do driver, consulte Análise de código para avisos de drivers. Para obter informações sobre o conjunto principal de avisos que a ferramenta de análise de código no Visual Studio relata, consulte Avisos de análise de código.

Anotações

Um dos recursos importantes que a ferramenta de análise de código fornece é a capacidade de anotar descrições de função e algumas outras entidades no código-fonte do driver. A ferramenta de Análise de Código possui escopo intrafuncional; ou seja, analisa as interações entre funções. O objetivo das anotações é fornecer uma expressão mais completa do contrato entre as funções chamada e chamadora, para que a ferramenta de Análise de Código possa verificar se o contrato é cumprido. Outro objetivo das anotações é que elas informem a quem lê o código como a função deve ser usada e quais resultados podem ser esperados. As anotações declaram o contrato da interface e não tentam descrever como esse contrato é alcançado. Em muitos casos, os resultados da execução da ferramenta Análise de Código refletem a ausência de uma anotação apropriada e, ao adicionar a anotação, o aviso sobre a anotação ausente é suprimido e verificações adicionais são habilitadas. Para obter mais informações, consulte Anotações SAL 2.0 para drivers do Windows. Para obter mais informações sobre o SAL 2.0, consulte Usando anotações de SAL para reduzir defeitos de código C/C++. O SAL 2.0 substitui o SAL 1.0. SAL 2.0 deve ser usado com o WDK para Windows 8. Se você precisar de informações sobre o SAL 1.0 para drivers, consulte a documentação do PREfast for Drivers Annotations fornecida com o WDK para Windows 7.

Interpretando o resultado

A Análise de Código para Drivers é fácil de executar e é executada rapidamente, mesmo em drivers e programas muito grandes. O trabalho para o desenvolvedor é examinar a saída, analisar os erros que a ferramenta de Análise de Código detectou e distinguir erros de codificação reais de código válido que a ferramenta de Análise de Código interpretou erroneamente.

Para obter uma referência abrangente que descreve cada aviso que a ferramenta de análise de código pode detectar, consulte Análise de código para avisos de drivers. Para obter informações sobre o conjunto principal de avisos que a ferramenta de análise de código no Visual Studio relata, consulte Avisos de análise de código.

A resolução de um aviso de análise de código normalmente envolve a atualização do código-fonte quando apropriado ou a adição de uma anotação para esclarecer o contrato de função. A adição de uma anotação permite que o analisador aplique o contrato para todos os chamadores futuros e também melhora a legibilidade.

Se os Resultados da Análise de Código mostrarem erros que você determinar, após um exame cuidadoso, são inválidos e não podem ser evitados mesmo com o uso de anotações, você pode optar por excluir ou suprimir esses avisos. Para obter mais informações, consulte Como executar a análise de código para drivers.

Como executar a análise de código para drivers

Ferramenta de análise de código no Visual Studio

Análise de código para avisos de drivers

Avisos de análise de código

Anotações de SAL 2.0 para drivers do Windows