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 |
---|---|
advertencia C28101: el módulo Controladores ha inferido que la función actual no es el tipo correcto de función |
|
advertencia C28110: los controladores deben proteger el estado de hardware de punto flotante. Consulte el uso de float. |
|
advertencia C28111: IRQL donde se guardó el estado de punto flotante no coincide con el IRQL actual (para esta operación de restauración). |
|
advertencia: C28114: La copia de una entrada completa de la pila IRP deja determinados campos inicializados que se deben borrar o actualizar. |
|
advertencia C28120: no se permite llamar a la función en el nivel de IRQ actual. El nivel actual es demasiado bajo. |
|
advertencia C28121: no se permite llamar a la función en el nivel de IRQ actual. El nivel actual es demasiado alto. |
|
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. |
|
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. |
|
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. |
|
advertencia C28126: el parámetro AccessMode a ObReferenceObject* debe ser IRP-RequestorMode> |
|
advertencia C28127: la función que se usa como rutina no coincide exactamente con el tipo esperado. |
|
advertencia C28128: se ha realizado directamente un acceso a un campo. Debe ser hecha por una rutina. |
|
advertencia C28129: se ha realizado una asignación a un operando, que solo se debe modificar mediante conjuntos de bits y borrados. |
|
advertencia C28131: La rutina DriverEntry debe guardar una copia del argumento, no el puntero, porque el Administrador de E/S libera el búfer. |
|
advertencia C28132: Tomar el tamaño del puntero |
|
advertencia C28133: IoInitializeTimer se llama mejor desde AddDevice |
|
advertencia C28134: el tipo de una etiqueta de grupo debe ser integral, no un puntero de cadena o cadena |
|
advertencia C28135: si el primer argumento para KeWaitForSingleObject es una variable local, el parámetro Mode debe ser KernelMode. |
|
advertencia C28139: el argumento debe coincidir exactamente con el tipo. |
|
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. |
|
advertencia C28143: una rutina de distribución que llama a IoMarkIrpPending también debe devolver STATUS_PENDING |
|
advertencia C28144: dentro de una rutina de cancelación, en el punto de salida, irQL en Irp-CancelIrql> debe ser el IRQL actual. |
|
advertencia C28145: Un controlador no debe modificar la estructura MDL opaca. |
|
advertencia C28146: los controladores del modo kernel deben usar ntstrsafe.h, no strsafe.h. Se encuentra en el archivo de origen |
|
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 |
|
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. |
|
advertencia C28151: el valor no es un valor legal para irQL |
|
advertencia C28152: la devolución de una función similar a AddDevice inesperadamente DO_DEVICE_INITIALIZING |
|
advertencia C28153: no se pudo evaluar el valor de irQL de una anotación en este contexto. |
|
advertencia C28156: el IRQL real es incoherente con el IRQL necesario |
|
advertencia C28157: IRQL nunca se restauró |
|
advertencia C28158: No se guardó IRQL |
|
advertencia C28161: Salir sin adquirir el derecho a usar hardware flotante |
|
advertencia C28162: salir mientras mantiene el derecho de usar hardware de punto flotante |
|
advertencia C28165: el puntero de función de la clase no coincide con la clase de función |
|
advertencia C28166: la función no restaura irQL al valor que estaba actual en la entrada de la función y es necesario hacerlo. |
|
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. |
|
advertencia C28168: la función dispatch no tiene una anotación de Dispatch_type que coincida con esta entrada de tabla de distribución |
|
advertencia C28169: la función dispatch no tiene ninguna anotación Dispatch_type |
|
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 |
|
advertencia C28171: la función tiene más de una instancia de PAGED_CODE o PAGED_CODE_LOCKED |
|
advertencia C28172: la función tiene PAGED_CODE o PAGED_CODE_LOCKED pero no se declara como en un segmento paginado |
|
advertencia C28173: la función actual parece adaptarse incorrectamente a la memoria física por encima de 4 GB |
|
advertencia C28175: un controlador no debe tener acceso al miembro de la estructura. |
|
advertencia C28176: un controlador no debe modificar el miembro de la estructura. |
|
advertencia C28177: la función se anota con más de una clase de función. Todo, pero uno se omitirá. |
|
advertencia C28260: se encontró un error de sintaxis en las anotaciones al analizar una propiedad dentro de una función. |
|
Se encontró un error de sintaxis en las anotaciones para la propiedad de la función . |
|
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í |
|
advertencia C28601: Evitar el bloqueo en HWND_BROADCAST |
|
advertencia C28602: Evite llamar a SendMessageTimeout con HWND_BROADCAST |
|
advertencia C28604: Evite llamar a SendMessageTimeout con SMTO_ABORTIFHUNG con un tiempo de espera de 0 |
|
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() |
|
advertencia C28616: condición de AV multiproceso |
|
advertencia C28617: evite usar el valor devuelto de _beginthread(). En su lugar, use _beginthreadex() |
|
advertencia C28623: conversión sin firmar de coordenadas GetMessagePos(). Use GET_X_LPARAM/GET_Y_LPARAM en lugar de LOWORD/HIWORD |
|
advertencia C28624: no hay ninguna llamada a Release() para que coincida con el recuento de referencias incrementado de LResultFromObject |
|
advertencia C28625: se optimizará la llamada de función que se usa para borrar datos confidenciales. |
|
advertencia C28636: Llamar a LocalFree en el puntero no asignado obtenido de llamadas a GetSecurityDescriptorOwner/Group/Dacl/Sacl |
|
advertencia C28637: Llamar a la función en un inicializador global no es seguro |
|
advertencia C28638: falta el código auxiliar de carga retrasada de la función |
|
advertencia C28639: Llamada al identificador de cierre con cadena |
|
advertencia C28640: la función delayload stub debe ser una función estática. |
|
advertencia C28644: Valor devuelto de DPA_InsertPtr no activado |
|
advertencia C28645: Se llamó a MessageBox mediante el símbolo de mensaje de signo de interrogación que ya no se recomienda |
|
advertencia C28648: PulseEvent es una función no confiable |
|
advertencia C28649: Las matrices automáticas o globales de pila nunca son NULL |
|
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. |
|
advertencia C28651: el inicializador estático provoca la copia en páginas de escritura debido a punteros de función miembro |
|
advertencia C28652: el inicializador estático provoca la copia en páginas de escritura debido a operadores bit a bit sobrecargados |
|
advertencia C28714: Conversión entre tipos enteros semánticamente diferentes |
|
advertencia C28715: Conversión entre tipos enteros semánticamente diferentes |
|
advertencia C28716: conversión insertada por el compilador entre tipos enteros semánticamente diferentes |
|
advertencia C28717: Tipo VARIANT no válido |
|
advertencia C28718: búfer no anotado |
|
advertencia C28719: Uso de API prohibida |
|
advertencia C28720: Uso prohibido de la API |
|
advertencia C28721: arquitectura de contador de rendimiento en desuso |
|
advertencia C28722: búfer no anotado en la declaración de función |
|
advertencia C28723: búfer no anotado en la definición de función que no tiene ninguna declaración correspondiente |
|
advertencia C28725: Use Watson en lugar de este SetUnhandledExceptionFilter |
|
advertencia C28726: Uso de API prohibida |
|
advertencia C28727: Uso prohibido de la API |
|
advertencia C28728: Uso prohibido de la API |
|
advertencia C28730: asignación posible de '\0' directamente a un puntero. |
|
advertencia C28735: Uso prohibido de la API crimson |
|
advertencia C28736: Uso de argumentos de API prohibidas |
|
advertencia C28740: búfer no anotado sin firmar |
|
advertencia C28741: búfer no anotado en la función |
|
advertencia C28742: búfer no anotado en la función |
|
advertencia C28750: Uso prohibido de lstrlen y sus variantes |
|
advertencia C28751: Uso prohibido de ExAllocatePool y sus variantes |
|
advertencia C28752: Uso prohibido de la API kernel32 o advapi32 |
|
advertencia C28753: Confiar en un orden indefinido de evaluación de parámetros |
|
advertencia C30029: Llamada a una función de asignación de memoria que solicita memoria ejecutable |
|
advertencia C30030: Llamar a una función de asignación de memoria y pasar un parámetro que indica la memoria ejecutable |
|
advertencia C30031: Llamar a una función de asignación de memoria y pasar un parámetro que indica la memoria ejecutable |
|
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 |
|
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. |
|
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. |
|
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. |