Compartilhar via


Análise de código para avisos de drivers

Esta seção lista e descreve os avisos que a Análise de Código para Drivers relata quando detecta um possível erro no código do driver. Observe que alguns avisos são destinados ao código de modo kernel e podem ser ignorados ao analisar drivers de modo de usuário.

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.

A Análise de Código para Drivers relata os seguintes tipos de avisos:

  • Avisos gerais (6000-6999): Possíveis erros na sintaxe C e C++ e prática geral de codificação. Para obter uma descrição desses avisos, consulte Análise de código para avisos C/C++.

  • Avisos específicos do Windows (28600-28799): esses avisos são específicos para determinados padrões de uso no Windows, mas não são específicos para drivers.

  • Avisos específicos do driver (28100-28199): erros na interação de um driver com o aplicativo, com outros drivers e com o sistema operacional.

  • Erros de anotação (28200-28299 e 36000-36999): Esses avisos indicam que uma anotação foi codificada incorretamente ou usada em um contexto impróprio. Na maioria dos casos, a presença de tal aviso indica que a anotação não está tendo o efeito desejado (ou qualquer).

  • Avisos de alocação de memória (30029-30035): são avisos de alocação de memória.

Nesta seção

Tópico Descrição

C28101

aviso C28101: O módulo Drivers inferiu que a função atual não é o tipo correto de função

C28110

aviso C28110: Os drivers devem proteger o estado do hardware de ponto flutuante. Ver uso de flutuador

C28111

aviso C28111: O IRQL onde o estado de ponto flutuante foi salvo não corresponde ao IRQL atual (para esta operação de restauração).

C28114

aviso: C28114: Copiar uma entrada de pilha IRP inteira deixa determinados campos inicializados que devem ser limpos ou atualizados.

C28120

aviso C28120: A função não tem permissão para ser chamada no nível IRQ atual. O nível atual é muito baixo.

C28121

aviso C28121: A função não tem permissão para ser chamada no nível IRQ atual. O nível atual é muito alto.

C28122

aviso C28122: A função não tem permissão para ser chamada em um nível de IRQ baixo. Chamadas de função anteriores são inconsistentes com essa restrição.

C28123

aviso C28123: A função não tem permissão para ser chamada em um nível alto de IRQ. Chamadas de função anteriores são inconsistentes com essa restrição.

C28124

aviso C28124: A chamada para faz com que o nível de IRQ seja definido abaixo do mínimo aceitável para a função que está sendo analisada.

C28126

aviso C28126: O parâmetro AccessMode para ObReferenceObject* deve ser IRP-RequestorMode>

C28127

aviso C28127: A função que está sendo usada como rotina não corresponde exatamente ao tipo esperado.

C28128

aviso C28128: Um acesso a um campo foi feito diretamente. Deve ser feito por uma rotina.

C28129

aviso C28129: Foi feita uma atribuição a um operando, que só deve ser modificado usando conjuntos de bits e limpadores

C28131

aviso C28131: A rotina DriverEntry deve salvar uma cópia do argumento, não o ponteiro, porque o Gerenciador de E/S libera o buffer

C28132

aviso C28132: Tomando o tamanho do ponteiro

C28133

aviso C28133: IoInitializeTimer é melhor chamado de AddDevice

C28134

aviso C28134: O tipo de uma tag de pool deve ser integral, não uma cadeia de caracteres ou ponteiro de cadeia de caracteres

C28135

aviso C28135: Se o primeiro argumento para KeWaitForSingleObject for uma variável local, o parâmetro Mode deverá ser KernelMode

C28139

aviso C28139: O argumento deve corresponder exatamente ao tipo

C28141

aviso C28141: O argumento faz com que o nível de IRQ seja definido abaixo do IRQL atual e essa função não pode ser usada para essa finalidade

C28143

aviso C28143: Uma rotina de despacho que chama IoMarkIrpPending também deve retornar STATUS_PENDING

C28144

aviso C28144: Dentro de uma rotina de cancelamento, no ponto de saída, o IRQL no Irp-CancelIrql> deve ser o IRQL atual.

C28145

aviso C28145: A estrutura MDL opaca não deve ser modificada por um driver

C28146

aviso C28146: Os drivers do Modo Kernel devem usar ntstrsafe.h, não strsafe.h. Encontrado no arquivo de origem

C28147

aviso C28147: O uso de uma tag de pool padrão (' kdD' ou ' mdW') para chamadas para essa função derrota o propósito da marcação de pool

C28150

aviso C28150: A função faz com que o nível de IRQ seja definido acima do máximo aceitável para a função que está sendo analisada

C28151

aviso C28151: O valor não é um valor legal para um IRQL

C28152

aviso C28152: O retorno de uma função semelhante a AddDevice inesperadamente DO_DEVICE_INITIALIZING

C28153

aviso C28153: O valor de um IRQL da anotação não pôde ser avaliado neste contexto.

C28156

aviso C28156: O IRQL real é inconsistente com o IRQL necessário

C28157

aviso C28157: O IRQL nunca foi restaurado

C28158

aviso C28158: Nenhum IRQL foi salvo

C28161

aviso C28161: Sair sem adquirir o direito de usar hardware flutuante

C28162

aviso C28162: Sair mantendo o direito de usar hardware de ponto flutuante

C28165

aviso C28165: O ponteiro de função da classe não corresponde à classe de função

C28166

aviso C28166: A função não restaura o IRQL para o valor que estava atual na entrada da função e é necessária para fazer isso.

C28167

aviso C28167: A função altera o IRQL e não restaura o IRQL antes de sair. Ele deve ser anotado para refletir a alteração ou o IRQL deve ser restaurado.

C28168

aviso C28168: A função de despacho não tem uma anotação de Dispatch_type correspondente a esta entrada da tabela de expedição

C28169

aviso C28169: A função de despacho não tem nenhuma Dispatch_type anotações

C28170

aviso C28170: A função foi declarada em um segmento paginado, mas nem PAGED_CODE nem PAGED_CODE_LOCKED foram encontrados

C28171

aviso C28171: A função tem mais de uma instância de PAGED_CODE ou PAGED_CODE_LOCKED

C28172

aviso C28172: A função tem PAGED_CODE ou PAGED_CODE_LOCKED mas não é declarada como estando em um segmento paginado

C28173

aviso C28173: A função atual parece se adaptar incorretamente à memória física acima de 4 GB

C28175

aviso C28175: O membro do struct não deve ser acessado por um driver

C28176

aviso C28176: O membro da struct não deve ser modificado por um driver

C28177

aviso C28177: A função é anotada com mais de uma classe de função. Todos, exceto um, serão ignorados.

C28260

aviso C28260: Um erro de sintaxe nas anotações foi encontrado durante a análise de uma propriedade dentro de uma função

C28266

Foi encontrado um erro de sintaxe nas anotações para a propriedade na função.

C28268

aviso C28268: A classe de função na função não corresponde à classe de função no typedef usado aqui

C28601

aviso C28601: Evite bloquear HWND_BROADCAST

C28602

aviso C28602: Evite chamar SendMessageTimeout com HWND_BROADCAST

C28604

aviso C28604: Evite chamar SendMessageTimeout com SMTO_ABORTIFHUNG com um tempo limite de 0

C28615

aviso C28615: Deve chamar _resetstkoflw no bloco __except() ao chamar _alloca no bloco __try. Não ligue para _resetstkoflw de dentro de um bloco catch()

C28616

aviso C28616: Condição AV multithreaded

C28617

aviso C28617: Evite usar o valor de retorno de _beginthread(). Em vez disso, use _beginthreadex()

C28623

aviso C28623: Conversão não assinada de coordenadas GetMessagePos(). Use GET_X_LPARAM/GET_Y_LPARAM em vez de LOWORD/HIWORD

C28624

aviso C28624: Nenhuma chamada para Release() para corresponder refcount incrementado de LResultFromObject

C28625

aviso C28625: A chamada de função usada para limpar dados confidenciais será otimizada

C28636

aviso C28636: Chamando LocalFree em ponteiro não alocado obtido de chamadas para GetSecurityDescriptorOwner/Group/Dacl/Sacl

C28637

aviso C28637: Chamar a função em um inicializador global não é seguro

C28638

aviso C28638: stub de carga de atraso de função está faltando uma declaração correspondente

C28639

aviso C28639: Chamando identificador de fechamento com cadeia de caracteres

C28640

aviso C28640: função delayload stub deve ser uma função estática

C28644

aviso C28644: Valor de retorno de DPA_InsertPtr não verificado

C28645

aviso C28645: MessageBox foi chamado usando o símbolo de mensagem de ponto de interrogação que não é mais recomendado

C28648

aviso C28648: PulseEvent é uma função não confiável

C28649

Aviso C28649: Automatic ou Global Stack Arrays nunca são NULL.

C28650

aviso C28650: O tipo para o qual !0 está sendo usado não o trata como caso de falha.

Retornando um valor de status como ! TRUE não é o mesmo que retornar um valor de status que indica falha.

C28651

aviso C28651: Inicializador estático causa cópia em páginas de gravação devido a ponteiros de função membro

C28652

aviso C28652: Inicializador estático causa cópia em páginas de gravação devido a operadores bit a bit sobrecarregados

C28714

aviso C28714: Converter entre tipos inteiros semanticamente diferentes

C28715

aviso C28715: Converter entre tipos inteiros semanticamente diferentes

C28716

aviso C28716: Conversão inserida pelo compilador entre tipos integrais semanticamente diferentes

C28717

aviso C28717: Tipo VARIANT inválido

C28718

aviso C28718: Buffer não anotado

C28719

aviso C28719: Uso proibido da API

C28720

aviso C28720: Uso proibido da API

C28721

aviso C28721: Arquitetura de contador de desempenho preterida

C28722

aviso C28722: Buffer não anotado na declaração de função

C28723

aviso C28723: Buffer não anotado na definição de função que não tem declaração correspondente

C28725

aviso C28725: Use Watson em vez deste SetUnhandledExceptionFilter

C28726

aviso C28726: Uso proibido da API

C28727

aviso C28727: Uso proibido da API

C28728

aviso C28728: Uso proibido da API

C28730

aviso C28730: Possível atribuição de '\0' diretamente a um ponteiro.

C28735

aviso C28735: Uso proibido da API Crimson

C28736

aviso C28736: Uso de argumento de API proibido

C28740

aviso C28740: Buffer não assinado não anotado

C28741

aviso C28741: buffer não anotado na função

C28742

aviso C28742: Buffer não anotado na função

C28750

aviso C28750: Proibido o uso de lstrlen e suas variantes

C28751

aviso C28751: Uso proibido do ExAllocatePool e suas variantes

C28752

aviso C28752: Uso proibido da API kernel32 ou advapi32

C28753

aviso C28753: Confiando em ordem indefinida de avaliação de parâmetros

C30029

aviso C30029: Chamando uma função de alocação de memória que solicita memória executável

C30030

aviso C30030: Chamando uma função de alocação de memória e passando um parâmetro que indica memória executável

C30031

aviso C30031: Chamando uma função de alocação de memória e passando um parâmetro que indica memória executável

C30032

aviso C30032: Chamando uma função de alocação de memória e forçando a solicitação de memória executável por meio do uso da diretiva POOL_NX_OPTOUT

C30033

aviso C30033: A alocação executável foi detectada em um driver compilado com POOL_NX_OPTIN. Este driver foi determinado para ser carregado em tempo de execução por outro driver. Verifique se o driver de carregamento chama ExInitializeDriverRuntime(DrvRtPoolNxOptIn) em seu DriverEntry.

C30034

aviso C30034: Passando um valor de sinalizador para uma função de alocação que pode resultar na alocação de memória executável. Verifique se a função de alocação não está solicitando um formulário de pool executável não paginado.

C30035

aviso C30035: Uma chamada foi feita para uma função que deve ser feita de dentro da função de inicialização (por exemplo, DriverEntry() ou DllInitialize()). O PREfast não pôde determinar se a chamada foi feita a partir da função de inicialização.