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 |
---|---|
aviso C28101: O módulo Drivers inferiu que a função atual não é o tipo correto de função |
|
aviso C28110: Os drivers devem proteger o estado do hardware de ponto flutuante. Ver uso de flutuador |
|
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). |
|
aviso: C28114: Copiar uma entrada de pilha IRP inteira deixa determinados campos inicializados que devem ser limpos ou atualizados. |
|
aviso C28120: A função não tem permissão para ser chamada no nível IRQ atual. O nível atual é muito baixo. |
|
aviso C28121: A função não tem permissão para ser chamada no nível IRQ atual. O nível atual é muito alto. |
|
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. |
|
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. |
|
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. |
|
aviso C28126: O parâmetro AccessMode para ObReferenceObject* deve ser IRP-RequestorMode> |
|
aviso C28127: A função que está sendo usada como rotina não corresponde exatamente ao tipo esperado. |
|
aviso C28128: Um acesso a um campo foi feito diretamente. Deve ser feito por uma rotina. |
|
aviso C28129: Foi feita uma atribuição a um operando, que só deve ser modificado usando conjuntos de bits e limpadores |
|
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 |
|
aviso C28132: Tomando o tamanho do ponteiro |
|
aviso C28133: IoInitializeTimer é melhor chamado de AddDevice |
|
aviso C28134: O tipo de uma tag de pool deve ser integral, não uma cadeia de caracteres ou ponteiro de cadeia de caracteres |
|
aviso C28135: Se o primeiro argumento para KeWaitForSingleObject for uma variável local, o parâmetro Mode deverá ser KernelMode |
|
aviso C28139: O argumento deve corresponder exatamente ao tipo |
|
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 |
|
aviso C28143: Uma rotina de despacho que chama IoMarkIrpPending também deve retornar STATUS_PENDING |
|
aviso C28144: Dentro de uma rotina de cancelamento, no ponto de saída, o IRQL no Irp-CancelIrql> deve ser o IRQL atual. |
|
aviso C28145: A estrutura MDL opaca não deve ser modificada por um driver |
|
aviso C28146: Os drivers do Modo Kernel devem usar ntstrsafe.h, não strsafe.h. Encontrado no arquivo de origem |
|
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 |
|
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 |
|
aviso C28151: O valor não é um valor legal para um IRQL |
|
aviso C28152: O retorno de uma função semelhante a AddDevice inesperadamente DO_DEVICE_INITIALIZING |
|
aviso C28153: O valor de um IRQL da anotação não pôde ser avaliado neste contexto. |
|
aviso C28156: O IRQL real é inconsistente com o IRQL necessário |
|
aviso C28157: O IRQL nunca foi restaurado |
|
aviso C28158: Nenhum IRQL foi salvo |
|
aviso C28161: Sair sem adquirir o direito de usar hardware flutuante |
|
aviso C28162: Sair mantendo o direito de usar hardware de ponto flutuante |
|
aviso C28165: O ponteiro de função da classe não corresponde à classe de função |
|
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. |
|
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. |
|
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 |
|
aviso C28169: A função de despacho não tem nenhuma Dispatch_type anotações |
|
aviso C28170: A função foi declarada em um segmento paginado, mas nem PAGED_CODE nem PAGED_CODE_LOCKED foram encontrados |
|
aviso C28171: A função tem mais de uma instância de PAGED_CODE ou PAGED_CODE_LOCKED |
|
aviso C28172: A função tem PAGED_CODE ou PAGED_CODE_LOCKED mas não é declarada como estando em um segmento paginado |
|
aviso C28173: A função atual parece se adaptar incorretamente à memória física acima de 4 GB |
|
aviso C28175: O membro do struct não deve ser acessado por um driver |
|
aviso C28176: O membro da struct não deve ser modificado por um driver |
|
aviso C28177: A função é anotada com mais de uma classe de função. Todos, exceto um, serão ignorados. |
|
aviso C28260: Um erro de sintaxe nas anotações foi encontrado durante a análise de uma propriedade dentro de uma função |
|
Foi encontrado um erro de sintaxe nas anotações para a propriedade na função. |
|
aviso C28268: A classe de função na função não corresponde à classe de função no typedef usado aqui |
|
aviso C28601: Evite bloquear HWND_BROADCAST |
|
aviso C28602: Evite chamar SendMessageTimeout com HWND_BROADCAST |
|
aviso C28604: Evite chamar SendMessageTimeout com SMTO_ABORTIFHUNG com um tempo limite de 0 |
|
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() |
|
aviso C28616: Condição AV multithreaded |
|
aviso C28617: Evite usar o valor de retorno de _beginthread(). Em vez disso, use _beginthreadex() |
|
aviso C28623: Conversão não assinada de coordenadas GetMessagePos(). Use GET_X_LPARAM/GET_Y_LPARAM em vez de LOWORD/HIWORD |
|
aviso C28624: Nenhuma chamada para Release() para corresponder refcount incrementado de LResultFromObject |
|
aviso C28625: A chamada de função usada para limpar dados confidenciais será otimizada |
|
aviso C28636: Chamando LocalFree em ponteiro não alocado obtido de chamadas para GetSecurityDescriptorOwner/Group/Dacl/Sacl |
|
aviso C28637: Chamar a função em um inicializador global não é seguro |
|
aviso C28638: stub de carga de atraso de função está faltando uma declaração correspondente |
|
aviso C28639: Chamando identificador de fechamento com cadeia de caracteres |
|
aviso C28640: função delayload stub deve ser uma função estática |
|
aviso C28644: Valor de retorno de DPA_InsertPtr não verificado |
|
aviso C28645: MessageBox foi chamado usando o símbolo de mensagem de ponto de interrogação que não é mais recomendado |
|
aviso C28648: PulseEvent é uma função não confiável |
|
Aviso C28649: Automatic ou Global Stack Arrays nunca são NULL. |
|
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. |
|
aviso C28651: Inicializador estático causa cópia em páginas de gravação devido a ponteiros de função membro |
|
aviso C28652: Inicializador estático causa cópia em páginas de gravação devido a operadores bit a bit sobrecarregados |
|
aviso C28714: Converter entre tipos inteiros semanticamente diferentes |
|
aviso C28715: Converter entre tipos inteiros semanticamente diferentes |
|
aviso C28716: Conversão inserida pelo compilador entre tipos integrais semanticamente diferentes |
|
aviso C28717: Tipo VARIANT inválido |
|
aviso C28718: Buffer não anotado |
|
aviso C28719: Uso proibido da API |
|
aviso C28720: Uso proibido da API |
|
aviso C28721: Arquitetura de contador de desempenho preterida |
|
aviso C28722: Buffer não anotado na declaração de função |
|
aviso C28723: Buffer não anotado na definição de função que não tem declaração correspondente |
|
aviso C28725: Use Watson em vez deste SetUnhandledExceptionFilter |
|
aviso C28726: Uso proibido da API |
|
aviso C28727: Uso proibido da API |
|
aviso C28728: Uso proibido da API |
|
aviso C28730: Possível atribuição de '\0' diretamente a um ponteiro. |
|
aviso C28735: Uso proibido da API Crimson |
|
aviso C28736: Uso de argumento de API proibido |
|
aviso C28740: Buffer não assinado não anotado |
|
aviso C28741: buffer não anotado na função |
|
aviso C28742: Buffer não anotado na função |
|
aviso C28750: Proibido o uso de lstrlen e suas variantes |
|
aviso C28751: Uso proibido do ExAllocatePool e suas variantes |
|
aviso C28752: Uso proibido da API kernel32 ou advapi32 |
|
aviso C28753: Confiando em ordem indefinida de avaliação de parâmetros |
|
aviso C30029: Chamando uma função de alocação de memória que solicita memória executável |
|
aviso C30030: Chamando uma função de alocação de memória e passando um parâmetro que indica memória executável |
|
aviso C30031: Chamando uma função de alocação de memória e passando um parâmetro que indica memória executável |
|
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 |
|
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. |
|
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. |
|
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. |