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 |
---|---|
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 o uso de float |
|
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). |
|
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 irq baixo. As 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 alto nível de IRQ. As chamadas de função anteriores são inconsistentes com essa restrição. |
|
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. |
|
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: uma atribuição foi feita em um operando, que só deve ser modificado usando conjuntos de bits e limpezas |
|
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: usando o tamanho do ponteiro |
|
Aviso C28133: IoInitializeTimer é melhor chamado de AddDevice |
|
aviso C28134: o tipo de uma marca de pool deve ser integral, não um ponteiro de cadeia de caracteres ou 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 do IRQ seja definido abaixo do IRQL atual e essa função não pode ser usada para essa finalidade |
|
aviso C28143: uma rotina de expedição que chama IoMarkIrpPending também deve retornar STATUS_PENDING |
|
Aviso C28144: dentro de uma rotina de cancelamento, no ponto de saída, o IRQL em 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 marca de pool padrão (' kdD' ou ' mdW') para chamadas para essa função derrota a finalidade da marcação de pool |
|
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 |
|
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 nesse 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: Saindo mantendo o direito de usar o 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 atual na entrada da função e é necessário para fazer isso. |
|
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. |
|
aviso C28168: a função dispatch não tem uma anotação Dispatch_type correspondente a esta entrada de tabela de expedição |
|
aviso C28169: a função dispatch não tem nenhuma anotação Dispatch_type |
|
aviso C28170: a função foi declarada como 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 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 do struct não deve ser modificado por um driver |
|
aviso C28177: a função é anotada com mais de uma classe de função. Todos, menos 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 |
|
Um erro de sintaxe nas anotações foi encontrado 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: evitar bloqueio em 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 chame _resetstkoflw de dentro de um bloco catch() |
|
aviso C28616: condição multithreaded AV |
|
aviso C28617: evite usar o valor retornado de _beginthread(). Em vez disso, use _beginthreadex() |
|
Aviso C28623: conversão não assinada de coordenadas GetMessagePos(). Usar GET_X_LPARAM/GET_Y_LPARAM em vez de LOWORD/HIWORD |
|
aviso C28624: nenhuma chamada para Release() para corresponder ao 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: a função delayload stub não tem uma declaração correspondente |
|
Aviso C28639: chamando o identificador close com cadeia de caracteres |
|
aviso C28640: o stub de delayload da função deve ser uma função estática |
|
aviso C28644: valor retornado 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: Matrizes de pilha automáticas ou globais 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 status como ! TRUE não é o mesmo que retornar um valor 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: o inicializador estático causa cópia em páginas de gravação devido a operadores bit a bit sobrecarregados |
|
aviso C28714: conversão entre tipos inteiros semanticamente diferentes |
|
aviso C28715: conversão 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 de API proibido |
|
aviso C28720: Uso de API proibido |
|
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 nenhuma declaração correspondente |
|
aviso C28725: use Watson em vez deste SetUnhandledExceptionFilter |
|
aviso C28726: Uso de API proibido |
|
aviso C28727: Uso de API proibido |
|
aviso C28728: Uso de API proibido |
|
aviso C28730: possível atribuição de '\0' diretamente a um ponteiro. |
|
aviso C28735: Uso proibido da API do Crimson |
|
aviso C28736: Uso de argumento de API proibido |
|
aviso C28740: buffer não anotado sem sinal |
|
aviso C28741: buffer não anotado na função |
|
aviso C28742: buffer não anotado na função |
|
aviso C28750: uso proibido de lstrlen e suas variantes |
|
aviso C28751: uso proibido de ExAllocatePool e suas variantes |
|
Aviso C28752: uso proibido de kernel32 ou API advapi32 |
|
aviso C28753: dependendo da 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: 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 |
|
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. |
|
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. |
|
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. |
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de