Introducción al análisis de código para controladores

El Kit de controladores de Windows proporciona una extensión específica del controlador para la herramienta De análisis de código de Microsoft Visual Studio. El análisis de código para controladores incluye reglas que solo se aplican a los controladores, especialmente los controladores en modo kernel. El análisis de código para controladores puede detectar posibles errores en el código en cuanto se pueda compilar el código.

Funcionamiento de la herramienta Análisis de código

La herramienta Análisis de código intercepta la llamada de la utilidad de compilación al compilador estándar, Cl.exe y, en su lugar, ejecuta un compilador de interceptación CL que analiza el código fuente del controlador y crea un archivo de registro de mensajes de error y advertencia. Puede ejecutar la herramienta Análisis de código por sí misma, o bien puede configurar la herramienta De análisis de código para que se ejecute al compilar el controlador. Al ejecutar la herramienta Análisis de código por sí misma (Analizar > análisis de código de ejecución en la solución), los resultados aparecen en la ventana Informe de análisis de código. Al ejecutar la herramienta De análisis de código como parte de la compilación, el compilador de interceptación cl crea un archivo de registro de mensajes de error y advertencia y, a continuación, llama a la versión estándar de Cl.exe para generar la salida de la compilación. Los archivos de objeto resultantes son los mismos que los generados por un comando de compilación estándar.

Cuando se ejecuta el compilador de interceptación, El análisis de código para controladores examina cada función del código de forma independiente y, a continuación, simula la ejecución de todas las rutas de acceso posibles a través del código, buscando errores comunes de controlador y prácticas de codificación no correctas. La herramienta Análisis de código se ejecuta relativamente rápidamente, incluso en controladores más grandes y el informe que genera precisamente identifica la línea de código del controlador con el error sospechoso.

Los tipos de errores que el análisis de código puede detectar

El análisis de código puede detectar varios tipos de errores, incluidos los errores de las siguientes categorías:

  • Memoria: Posibles fugas de memoria, punteros NULL desreferenciados, acceso a memoria no inicializada, uso excesivo de la pila en modo kernel y uso incorrecto de etiquetas de grupo.

  • Recursos: Error al liberar recursos como bloqueos, recursos que deben mantenerse al llamar a algunas funciones y recursos que no se deben mantener al llamar a otras funciones.

  • Uso de la función: Uso potencialmente incorrecto de ciertas funciones, argumentos de función que aparecen errores de coincidencia de tipos de argumentos posibles para funciones que no comprueban estrictamente los tipos, el posible uso de determinadas funciones obsoletas y las llamadas a funciones en un IRQL potencialmente incorrecto.

  • Estado de punto flotante: Error al proteger el estado de hardware de punto flotante en un controlador e intentar restaurar el estado de punto flotante después de guardarlo en un IRQL diferente.

  • Reglas de precedencia: Código que podría no comportarse como el programador previsto debido a las reglas de precedencia de programación de C.

  • Procedimientos de codificación en modo kernel: Prácticas de codificación que pueden provocar errores, como modificar una estructura de lista de descriptores de memoria opaco (MDL), no examinar el valor de una variable establecida por una función llamada y usar funciones de manipulación de cadenas de C/C++ en lugar de las funciones de cadena seguras definidas en Ntstrsafe.h.

  • Prácticas de codificación específicas del controlador: Operaciones específicas que suelen ser un origen de errores en los controladores en modo kernel. Por ejemplo, copiar un paquete de solicitud de E/S completo (IRP) sin modificar miembros y guardar un puntero en un argumento de cadena o estructura en lugar de copiar un argumento en una rutina DriverEntry .

Advertencias de análisis de código

La herramienta Análisis de código usa un modelo basado en reglas para identificar errores en el código del programa o del controlador. Cada regla está asociada a una advertencia que se notifica si la herramienta De análisis de código detecta una infracción de la regla. Para obtener información detallada sobre las advertencias específicas del controlador, consulte Análisis de código para las advertencias de controladores. Para obtener información sobre el conjunto básico de advertencias que la herramienta De análisis de código en informes de Visual Studio, vea Advertencias de análisis de código.

Anotaciones

Una de las funcionalidades importantes que proporciona la herramienta Análisis de código es la capacidad de anotar descripciones de funciones y otras entidades en el código fuente del controlador. La herramienta Análisis de código tiene un ámbito intra-funcional; es decir, analiza las interacciones entre las funciones. El objetivo de las anotaciones es proporcionar una expresión más completa del contrato entre las funciones llamadas y de llamada, de modo que la herramienta Análisis de código pueda comprobar que se cumple el contrato. Otro objetivo de las anotaciones es que informen a quién lee el código cómo se debe usar la función y qué resultados se pueden esperar. Las anotaciones declaran el contrato de la interfaz y no intentan describir cómo se logra ese contrato. En muchos casos, los resultados de la ejecución de la herramienta De análisis de código reflejan la ausencia de una anotación adecuada y, al agregar la anotación, se suprime la advertencia sobre la anotación que falta y se habilitan comprobaciones adicionales. Para obtener más información, vea Anotaciones sal 2.0 para controladores de Windows. Para obtener más información sobre SAL 2.0, consulte Uso de anotaciones SAL para reducir defectos de código de C/C++. SAL 2.0 reemplaza a SAL 1.0. SAL 2.0 debe usarse con el WDK para Windows 8. Si necesitas información sobre SAL 1.0 para controladores, consulta la documentación PREfast for Drivers Annotations que se incluye con el WDK para Windows 7.

Interpretación del resultado

El análisis de código para controladores es fácil de ejecutar y se ejecuta rápidamente, incluso en controladores y programas muy grandes. El trabajo para el desarrollador está examinando la salida, analizando los errores detectados por la herramienta Análisis de código y distinguendo los errores de codificación reales del código válido que la herramienta Análisis de código interpretó erróneamente.

Para obtener una referencia completa que describa cada advertencia que la herramienta de análisis de código podría detectar, consulte Análisis de código para las advertencias de controladores. Para obtener información sobre el conjunto básico de advertencias que la herramienta De análisis de código en informes de Visual Studio, vea Advertencias de análisis de código.

La resolución de una advertencia de análisis de código normalmente implica actualizar el código fuente cuando corresponda o agregar una anotación para aclarar el contrato de función. Agregar una anotación permite al analizador aplicar el contrato para todos los autores de llamadas futuros y también mejora la legibilidad.

Si los resultados del análisis de código muestran errores que determina, después de un examen cuidadoso, no son válidos y no se pueden evitar incluso con el uso de anotaciones, puede optar por excluir o suprimir estas advertencias. Para obtener más información, vea Ejecución de análisis de código para controladores.

Ejecución de análisis de código para controladores

Herramienta de análisis de código en Visual Studio

Advertencias de análisis de código para controladores

Advertencias de análisis de código

Anotaciones SAL 2.0 para controladores de Windows