Compartir a través de


Advertencias de análisis de código para controladores

En esta sección se enumeran y describen las advertencias que notifica el análisis de código para controladores cuando detecta un posible error en el código de controlador. Tenga en cuenta que algunas advertencias están pensadas para el código en modo kernel y se pueden omitir al analizar controladores en modo de usuario.

Importante

El análisis de código de los controladores está disponible en WDK y EWDK de Windows 24H2, pero tenga en cuenta que está configurado para retirarse en una fecha futura.
En el futuro, CodeQL será la herramienta de análisis estático principal para los controladores. CodeQL proporciona un lenguaje de consulta eficaz que trata el código como una base de datos que se va a consultar, lo que facilita la escritura de consultas para comportamientos, patrones y mucho más específicos. Para obtener más información sobre el uso de CodeQL, consulte CodeQL y la prueba de logotipo de herramientas estáticas.

El análisis de código para controladores notifica los siguientes tipos de advertencias:

  • Advertencias generales (6000-6999): posibles errores en la sintaxis de C y C++ y la práctica de codificación general. Para obtener una descripción de estas advertencias, vea Análisis de código para advertencias de C/C++.

  • Advertencias específicas de Windows (28600-28799): estas advertencias son específicas de determinados patrones de uso en Windows, pero no son específicos de los controladores.

  • Advertencias específicas del controlador (28100-28199): errores en la interacción de un controlador con la aplicación, con otros controladores y con el sistema operativo.

  • Errores de anotación (28200-28299 y 36000-36999): estas advertencias indican que una anotación se ha codificado o usado incorrectamente en un contexto incorrecto. En la mayoría de los casos, la presencia de dicha advertencia indica que la anotación no tiene el efecto deseado (o ninguno).

  • Advertencias de asignación de memoria (30029-30035): estas son advertencias de asignación de memoria.

En esta sección

Tema Descripción

C28101

advertencia C28101: el módulo Controladores ha inferido que la función actual no es el tipo correcto de función

C28110

advertencia C28110: los controladores deben proteger el estado de hardware de punto flotante. Consulte el uso de float.

C281111

advertencia C28111: IRQL donde se guardó el estado de punto flotante no coincide con el IRQL actual (para esta operación de restauración).

C28114

advertencia: C28114: La copia de una entrada completa de la pila IRP deja determinados campos inicializados que se deben borrar o actualizar.

C28120

advertencia C28120: no se permite llamar a la función en el nivel de IRQ actual. El nivel actual es demasiado bajo.

C28121

advertencia C28121: no se permite llamar a la función en el nivel de IRQ actual. El nivel actual es demasiado alto.

C28122

advertencia C28122: no se permite llamar a la función en un nivel de IRQ bajo. Las llamadas a funciones anteriores son incoherentes con esta restricción.

C28123

advertencia C28123: no se permite llamar a la función en un nivel alto de IRQ. Las llamadas a funciones anteriores son incoherentes con esta restricción.

C28124

advertencia C28124: la llamada a hace que el nivel de IRQ se establezca debajo del mínimo aceptable para la función que se está analizando.

C28126

advertencia C28126: el parámetro AccessMode a ObReferenceObject* debe ser IRP-RequestorMode>

C28127

advertencia C28127: la función que se usa como rutina no coincide exactamente con el tipo esperado.

C28128

advertencia C28128: se ha realizado directamente un acceso a un campo. Debe ser hecha por una rutina.

C28129

advertencia C28129: se ha realizado una asignación a un operando, que solo se debe modificar mediante conjuntos de bits y borrados.

C28131

advertencia C28131: La rutina DriverEntry debe guardar una copia del argumento, no el puntero, porque el Administrador de E/S libera el búfer.

C28132

advertencia C28132: Tomar el tamaño del puntero

C28133

advertencia C28133: IoInitializeTimer se llama mejor desde AddDevice

C28134

advertencia C28134: el tipo de una etiqueta de grupo debe ser integral, no un puntero de cadena o cadena

C28135

advertencia C28135: si el primer argumento para KeWaitForSingleObject es una variable local, el parámetro Mode debe ser KernelMode.

C28139

advertencia C28139: el argumento debe coincidir exactamente con el tipo.

C28141

advertencia C28141: el argumento hace que el nivel irQ se establezca debajo del IRQL actual y esta función no se puede usar para ese propósito.

C28143

advertencia C28143: una rutina de distribución que llama a IoMarkIrpPending también debe devolver STATUS_PENDING

C28144

advertencia C28144: dentro de una rutina de cancelación, en el punto de salida, irQL en Irp-CancelIrql> debe ser el IRQL actual.

C28145

advertencia C28145: Un controlador no debe modificar la estructura MDL opaca.

C28146

advertencia C28146: los controladores del modo kernel deben usar ntstrsafe.h, no strsafe.h. Se encuentra en el archivo de origen

C28147

advertencia C28147: el uso de una etiqueta de grupo predeterminada (' kdD' o 'mdW') para las llamadas a esta función derrota el propósito del etiquetado de grupos

C28150

advertencia C28150: la función hace que el nivel de IRQ se establezca por encima del máximo aceptable para la función que se está analizando.

C28151

advertencia C28151: el valor no es un valor legal para irQL

C28152

advertencia C28152: la devolución de una función similar a AddDevice inesperadamente DO_DEVICE_INITIALIZING

C28153

advertencia C28153: no se pudo evaluar el valor de irQL de una anotación en este contexto.

C28156

advertencia C28156: el IRQL real es incoherente con el IRQL necesario

C28157

advertencia C28157: IRQL nunca se restauró

C28158

advertencia C28158: No se guardó IRQL

C28161

advertencia C28161: Salir sin adquirir el derecho a usar hardware flotante

C28162

advertencia C28162: salir mientras mantiene el derecho de usar hardware de punto flotante

C28165

advertencia C28165: el puntero de función de la clase no coincide con la clase de función

C28166

advertencia C28166: la función no restaura irQL al valor que estaba actual en la entrada de la función y es necesario hacerlo.

C28167

advertencia C28167: la función cambia IRQL y no restaura IRQL antes de salir. Debe anotarse para reflejar el cambio o se debe restaurar IRQL.

C28168

advertencia C28168: la función dispatch no tiene una anotación de Dispatch_type que coincida con esta entrada de tabla de distribución

C28169

advertencia C28169: la función dispatch no tiene ninguna anotación Dispatch_type

C28170

advertencia C28170: se ha declarado que la función está en un segmento paginado, pero no se encontró ni PAGED_CODE ni PAGED_CODE_LOCKED

C28171

advertencia C28171: la función tiene más de una instancia de PAGED_CODE o PAGED_CODE_LOCKED

C28172

advertencia C28172: la función tiene PAGED_CODE o PAGED_CODE_LOCKED pero no se declara como en un segmento paginado

C28173

advertencia C28173: la función actual parece adaptarse incorrectamente a la memoria física por encima de 4 GB

C28175

advertencia C28175: un controlador no debe tener acceso al miembro de la estructura.

C28176

advertencia C28176: un controlador no debe modificar el miembro de la estructura.

C28177

advertencia C28177: la función se anota con más de una clase de función. Todo, pero uno se omitirá.

C28260

advertencia C28260: se encontró un error de sintaxis en las anotaciones al analizar una propiedad dentro de una función.

C28266

Se encontró un error de sintaxis en las anotaciones para la propiedad de la función .

C28268

advertencia C28268: la clase de función de la función no coincide con la clase de función en la definición de tipo usada aquí

C28601

advertencia C28601: Evitar el bloqueo en HWND_BROADCAST

C28602

advertencia C28602: Evite llamar a SendMessageTimeout con HWND_BROADCAST

C28604

advertencia C28604: Evite llamar a SendMessageTimeout con SMTO_ABORTIFHUNG con un tiempo de espera de 0

C28615

advertencia C28615: debe llamar a _resetstkoflw en el bloque __except() al llamar a _alloca en el bloque __try. No llame a _resetstkoflw desde dentro de un bloque catch()

C28616

advertencia C28616: condición de AV multiproceso

C28617

advertencia C28617: evite usar el valor devuelto de _beginthread(). En su lugar, use _beginthreadex()

C28623

advertencia C28623: conversión sin firmar de coordenadas GetMessagePos(). Use GET_X_LPARAM/GET_Y_LPARAM en lugar de LOWORD/HIWORD

C28624

advertencia C28624: no hay ninguna llamada a Release() para que coincida con el recuento de referencias incrementado de LResultFromObject

C28625

advertencia C28625: se optimizará la llamada de función que se usa para borrar datos confidenciales.

C28636

advertencia C28636: Llamar a LocalFree en el puntero no asignado obtenido de llamadas a GetSecurityDescriptorOwner/Group/Dacl/Sacl

C28637

advertencia C28637: Llamar a la función en un inicializador global no es seguro

C28638

advertencia C28638: falta el código auxiliar de carga retrasada de la función

C28639

advertencia C28639: Llamada al identificador de cierre con cadena

C28640

advertencia C28640: la función delayload stub debe ser una función estática.

C28644

advertencia C28644: Valor devuelto de DPA_InsertPtr no activado

C28645

advertencia C28645: Se llamó a MessageBox mediante el símbolo de mensaje de signo de interrogación que ya no se recomienda

C28648

advertencia C28648: PulseEvent es una función no confiable

C28649

advertencia C28649: Las matrices automáticas o globales de pila nunca son NULL

C28650

advertencia C28650: el tipo para el que se usa !0 no lo trata como caso de error.

Devolver un valor de estado como ! TRUE no es lo mismo que devolver un valor de estado que indica un error.

C28651

advertencia C28651: el inicializador estático provoca la copia en páginas de escritura debido a punteros de función miembro

C28652

advertencia C28652: el inicializador estático provoca la copia en páginas de escritura debido a operadores bit a bit sobrecargados

C28714

advertencia C28714: Conversión entre tipos enteros semánticamente diferentes

C28715

advertencia C28715: Conversión entre tipos enteros semánticamente diferentes

C28716

advertencia C28716: conversión insertada por el compilador entre tipos enteros semánticamente diferentes

C28717

advertencia C28717: Tipo VARIANT no válido

C28718

advertencia C28718: búfer no anotado

C28719

advertencia C28719: Uso de API prohibida

C28720

advertencia C28720: Uso prohibido de la API

C28721

advertencia C28721: arquitectura de contador de rendimiento en desuso

C28722

advertencia C28722: búfer no anotado en la declaración de función

C28723

advertencia C28723: búfer no anotado en la definición de función que no tiene ninguna declaración correspondiente

C28725

advertencia C28725: Use Watson en lugar de este SetUnhandledExceptionFilter

C28726

advertencia C28726: Uso de API prohibida

C28727

advertencia C28727: Uso prohibido de la API

C28728

advertencia C28728: Uso prohibido de la API

C28730

advertencia C28730: asignación posible de '\0' directamente a un puntero.

C28735

advertencia C28735: Uso prohibido de la API crimson

C28736

advertencia C28736: Uso de argumentos de API prohibidas

C28740

advertencia C28740: búfer no anotado sin firmar

C28741

advertencia C28741: búfer no anotado en la función

C28742

advertencia C28742: búfer no anotado en la función

C28750

advertencia C28750: Uso prohibido de lstrlen y sus variantes

C28751

advertencia C28751: Uso prohibido de ExAllocatePool y sus variantes

C28752

advertencia C28752: Uso prohibido de la API kernel32 o advapi32

C28753

advertencia C28753: Confiar en un orden indefinido de evaluación de parámetros

C30029

advertencia C30029: Llamada a una función de asignación de memoria que solicita memoria ejecutable

C30030

advertencia C30030: Llamar a una función de asignación de memoria y pasar un parámetro que indica la memoria ejecutable

C30031

advertencia C30031: Llamar a una función de asignación de memoria y pasar un parámetro que indica la memoria ejecutable

C30032

advertencia C30032: Llamada a una función de asignación de memoria y forzar la solicitud de memoria ejecutable mediante el uso de la directiva POOL_NX_OPTOUT

C30033

advertencia C30033: se detectó la asignación ejecutable en un controlador compilado con POOL_NX_OPTIN. Otro controlador ha determinado que otro controlador cargará este controlador en tiempo de ejecución. Compruebe que el controlador de carga llama a ExInitializeDriverRuntime(DrvRtPoolNxOptIn) en su DriverEntry.

C30034

advertencia C30034: pasar un valor de marca a una función de asignación que podría dar lugar a que se asigne memoria ejecutable. Compruebe que la función de asignación no solicita un formulario de grupo no paginado ejecutable.

C30035

advertencia C30035: se realizó una llamada a una función que se debe realizar desde dentro de la función de inicialización (por ejemplo, DriverEntry() o DllInitialize()). PREfast no pudo determinar si la llamada se realizó desde la función de inicialización.