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 do modo kernel e podem ser ignorados ao analisar drivers de modo de usuário.

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

  • Avisos Gerais (6000-6999): erros potenciais 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 inadequado. Na maioria dos casos, a presença desse 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 o uso de float

C28111

aviso C28111: o IRQL em que 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 irq baixo. As 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 alto nível de IRQ. As chamadas de função anteriores são inconsistentes com essa restrição.

C28124

aviso C28124: a chamada para faz com que o Nível do 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: uma atribuição foi feita em um operando, que só deve ser modificado usando conjuntos de bits e limpezas

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: usando o tamanho do ponteiro

C28133

Aviso C28133: IoInitializeTimer é melhor chamado de AddDevice

C28134

aviso C28134: o tipo de uma marca de pool deve ser integral, não um ponteiro de cadeia de caracteres ou 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 do 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 expedição 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 em 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 marca de pool padrão (' kdD' ou ' mdW') para chamadas para essa função derrota a finalidade da marcação de pool

C28150

aviso C28150: a função faz com que o Nível do 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 nesse 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: Saindo mantendo o direito de usar o 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 atual na entrada da função e é necessário para fazer isso.

C28167

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

C28168

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

C28169

aviso C28169: a função dispatch não tem nenhuma anotação Dispatch_type

C28170

aviso C28170: a função foi declarada como 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 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 do 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, menos 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

Um erro de sintaxe nas anotações foi encontrado 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: evitar bloqueio em 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 chame _resetstkoflw de dentro de um bloco catch()

C28616

aviso C28616: condição multithreaded AV

C28617

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

C28623

Aviso C28623: conversão não assinada de coordenadas GetMessagePos(). Usar GET_X_LPARAM/GET_Y_LPARAM em vez de LOWORD/HIWORD

C28624

aviso C28624: nenhuma chamada para Release() para corresponder ao 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: a função delayload stub não tem uma declaração correspondente

C28639

Aviso C28639: chamando o identificador close com cadeia de caracteres

C28640

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

C28644

aviso C28644: valor retornado 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: Matrizes de pilha automáticas ou globais 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 status como ! TRUE não é o mesmo que retornar um valor 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: o inicializador estático causa cópia em páginas de gravação devido a operadores bit a bit sobrecarregados

C28714

aviso C28714: conversão entre tipos inteiros semanticamente diferentes

C28715

aviso C28715: conversão 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 de API proibido

C28720

aviso C28720: Uso de API proibido

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 nenhuma declaração correspondente

C28725

aviso C28725: use Watson em vez deste SetUnhandledExceptionFilter

C28726

aviso C28726: Uso de API proibido

C28727

aviso C28727: Uso de API proibido

C28728

aviso C28728: Uso de API proibido

C28730

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

C28735

aviso C28735: Uso proibido da API do Crimson

C28736

aviso C28736: Uso de argumento de API proibido

C28740

aviso C28740: buffer não anotado sem sinal

C28741

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

C28742

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

C28750

aviso C28750: uso proibido de lstrlen e suas variantes

C28751

aviso C28751: uso proibido de ExAllocatePool e suas variantes

C28752

Aviso C28752: uso proibido de kernel32 ou API advapi32

C28753

aviso C28753: dependendo da 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: chamar uma função de alocação de memória e forçar 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 a 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 uma forma de pool executável nãopagado.

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()). PREfast não pôde determinar se a chamada foi feita a partir da função de inicialização.