Muchos de nuestros artículos se centran en cualquier cosa, pero no en la herramienta PVS-Studio en sí. Mientras que hacemos mucho para que su uso sea conveniente para los desarrolladores. Sin embargo, nuestros esfuerzos a menudo se ocultan detrás de escena. Decidí remediar esta situación y contarles sobre el complemento PVS-Studio para Visual Studio. Si usa Visual Studio, este artículo es para usted.
¿Qué es el análisis de código estático y por qué lo necesitamos?
El análisis de código estático es el proceso de detectar errores y fallas en el código fuente de los programas. El análisis estático puede considerarse como un proceso de revisión automática de código. La
revisión conjunta del
código es una metodología maravillosa. Sin embargo, tiene un inconveniente significativo: alto costo. Es necesario reunir a varios programadores para revisar el código recién escrito o reescrito después de las modificaciones realizadas en él.
Por un lado, queremos revisar el código regularmente. Por otro lado, es demasiado caro. La solución de compromiso son las herramientas de análisis estático. Analizan seriamente el código fuente de los programas y dan recomendaciones a los programadores sobre la revisión de ciertos fragmentos de código. Por supuesto, un programa no sustituirá una revisión de código completa, realizada por un equipo de desarrolladores. Sin embargo, la relación precio / beneficios hace que el análisis estático sea una práctica bastante útil, aplicada por muchas empresas. Si el lector está interesado en números precisos, le sugiero que lea el artículo "
ROI de PVS-Studio ".
Hay muchos analizadores de código estático comerciales y gratuitos. Una gran lista de analizadores estáticos está disponible en Wikipedia:
Lista de herramientas para el análisis de código estático . La lista de lenguajes para los que hay analizadores de código estático es bastante grande (C, C ++, C #, Java, Ada, Fortran, Perl, Ruby, ...). No hace falta decir que le informaremos sobre el
analizador PVS-Studio.
La principal ventaja del análisis de código estático es la oportunidad de reducir en gran medida el costo de eliminar defectos en un programa. Cuanto antes se detecte un error, menos costoso será corregirlo. Por lo tanto, de acuerdo con el libro "Code Complete" de McConnell, la detección de errores en la etapa de prueba de código es diez veces más costosa que en la etapa de diseño de código (codificación):
Figura 1. Costo promedio de corrección de defectos según el momento de su aparición y detección en el código (los datos de la tabla están tomados del libro 'Code Complete' de S. McConnell)Las herramientas de análisis estático permiten detectar una gran cantidad de errores, típicos de la etapa de diseño de código, lo que reduce significativamente el costo de todo el desarrollo del proyecto. Por ejemplo, el analizador de código estático PVS-Studio se puede ejecutar en modo de fondo inmediatamente después de la compilación y, en caso de encontrar posibles errores, lo notificará a un programador. Más sobre este modo se dará a continuación.
Analizador de código estático PVS-Studio
PVS-Studio es un analizador estático que detecta errores y posibles vulnerabilidades en el código fuente de aplicaciones en C, C ++ (otras extensiones compatibles:
C ++ / CLI y
C ++ / CX ), C # y Java en plataformas Windows, Linux y macOS. El analizador está perfectamente integrado en Visual Studio 2010 - 2019 e IDE IntelliJ IDEA. En este artículo, veremos más de cerca a PVS-Studio, verificando el código en los lenguajes C, C ++ y C #. Puede leer sobre cómo usar PVS-Studio para verificar el código Java en IntelliJ IDEA
aquí .
Después de la instalación de PVS-Studio y su integración en Visual Studio, los usuarios obtienen un elemento adicional "PVS-Studio" en el menú principal y la ventana para trabajar con mensajes de error:
Figura 2. Los elementos principales que agrega el analizador PVS-Studio al integrarse en Visual Studio.Configuraciones iniciales
El analizador está listo para funcionar justo después de la instalación. En la mayoría de los casos, no necesita configurar nada para la primera ejecución. La única configuración que puede necesitar al principio es la exclusión de bibliotecas de terceros. No va a arreglar nada en los archivos originales, por ejemplo, la biblioteca jpeg, por lo que no es necesario verificarlo. Además, la exclusión de carpetas innecesarias acelerará el análisis del proyecto. Aquí se establecen las excepciones del directorio: PVS-Studio> Opciones ...> No verificar archivos> PathMasks (consulte la Figura 3).
Figura 3. Edición de una lista de directorios que el analizador no verificará.Si en el nombre completo del archivo hay uno de los nombres especificados, el análisis no se realizará para este archivo. Por defecto, los nombres de algunos directorios ya están incluidos en la lista. Sin embargo, en su proyecto, el directorio con la biblioteca ZLib puede llamarse no "zlib", sino, por ejemplo, "zip_lib". Por lo tanto, esta lista debe ser editada. Para comenzar a editar, debe hacer clic en un botón con tres puntos.
Ejemplos de máscaras aceptables para la lista PathMasks:
- c: \ Libs \: se excluirán todos los archivos de este directorio y sus subdirectorios.
- \ Libs \ o * \ Libs \ *: se excluirán todos los archivos de los directorios cuya ruta contenga el subdirectorio "Libs". Si no se especifican los símbolos "*", se agregarán automáticamente de todos modos, por lo que ambas opciones son iguales.
- Libs o * Libs *: todos los archivos cuya ruta contiene el subdirectorio, cuyo nombre es igual o contiene 'Libs'. También en este caso, todos los archivos que contengan Libs en su nombre, por ejemplo, c: \ project \ mylibs.cpp, serán excluidos. Para evitar confusiones, recomendamos usar siempre barras.
Además de excluir directorios completos, puede configurar máscaras para excluir archivos individuales. Para hacer esto, existe la configuración FileNameMasks. Obtenga más información sobre cómo trabajar con listas de excepciones en la documentación:
Configuración: No verificar archivos .
Verificación del proyecto
Cuando complete la configuración inicial, puede comenzar a verificar el proyecto. PVS-Studio para Visual Studio admite la comprobación de proyectos C ++ (.vcxproj) y C # (.csproj). También puede intentar comprobar de inmediato toda la solución, que contiene proyectos de este tipo. Para hacer esto, seleccione el elemento del menú Extensiones Extensiones> PVS-Studio> Verificar> Solución (Ver Figura 4).
Figura 4. Verificación de una solución utilizando el analizador PVS-Studio.Si hay algunas dificultades con la verificación, recomendamos consultar la sección "
PVS-Studio: Solución de problemas " en nuestro sitio web. Estas no son recomendaciones estúpidas en el espíritu de "verificar que el enchufe esté insertado en el enchufe". La sección describe situaciones típicas de las solicitudes de los usuarios y sugiere opciones.
Trabajando con una lista de mensajes de diagnóstico
Después de la verificación, todos los mensajes de diagnóstico se mostrarán en una ventana especial. La ventana tiene muchos componentes de control. Todos ellos sirven para mostrar exactamente aquellos mensajes de diagnóstico que son interesantes para el usuario. Sin embargo, en el primer momento la ventana puede parecer complicada. Veamos todos los componentes de control (ver Figura 5).
Figura 5. Una ventana con mensajes de diagnóstico.- Bueno, aquí está la ventana PVS-Studio.
- Menú adicional Le permite acceder a opciones como marcar advertencias como falsas, ocultar mensajes, agregar archivos a excepciones (lea sobre esto a continuación).
- El botón habilita los mensajes "algo salió mal". Por ejemplo, uno de los archivos no puede ser preprocesado.
- Ir al mensaje anterior / siguiente. Esto abre el archivo relevante y el cursor se coloca en la línea con un posible error. Además, siempre puede seleccionar un diagnóstico de la lista con un doble clic. Puede configurar teclas de acceso rápido para las transiciones al mensaje anterior / siguiente. Por defecto, es Alt + '[' y Alt + ']'.
- Botones que incluyen advertencias de diferentes niveles. Los dos primeros niveles de diagnóstico ahora están habilitados. Al mismo tiempo, la ventana muestra 90 advertencias del primer nivel, 6700 advertencias del segundo nivel. El nivel del mensaje se muestra en el lado izquierdo de la ventana como una tira, correspondiente al color de la tira en el botón de nivel correspondiente. ¿Por qué hay tantos disparos? ¿Por qué 6700 advertencias? Para demostrar las capacidades de la interfaz, se habilita un conjunto de reglas MISRA , lo cual es inapropiado para las aplicaciones normales :).
- Conjuntos activos de reglas de diagnóstico. General: diagnóstico general, Optimización: microoptimización, diagnóstico de 64 bits - 64 bits, diagnóstico estándar MISRA - MISRA C y MISRA C ++. Ahora se muestran todo tipo de advertencias en la ventana.
- El indicador muestra el número de advertencias, marcadas como falsas (falsas alarmas). Puede habilitar / deshabilitar la visualización de mensajes marcados en la configuración: PVS-Studio> Opciones ...> Configuración específica del analizador> Mostrar falsas alarmas.
- Filtros rápidos Por ejemplo, puede acortar la lista a solo mensajes con código V501 y los del proyecto XYZ.
- Algunos diagnósticos sugieren prestar atención no a una, sino a varias líneas. En este caso, aparecen puntos al lado del número de línea. Al hacer clic en él, puede ver la lista de líneas y elegir una de ellas.
La tabla con mensajes de diagnóstico se divide en las siguientes columnas:
- Nivel El nivel de certeza que indica que se encontró un error, no un olor a código. El nivel 1 (rojo) muestra los lugares más sospechosos. El nivel 3 (amarillo) es probablemente una imprecisión no esencial en el código.
- Estrella No tiene un propósito específico. Los usuarios pueden interpretarlo como lo deseen. Por ejemplo, un usuario puede marcar las advertencias más interesantes para un análisis más detallado. La analogía es la marca estrella de los correos electrónicos en clientes de correo como Thunderbird o Outlook.
- ID Número de mensaje único. Puede ser útil cuando se trata de una lista grande. Por ejemplo, puede ir a un mensaje con un número específico (consulte "Ir a ID ..." en el menú contextual ).
- Código Código de mensaje Si hace clic en él, abrirá una página que describe la advertencia.
- CWE Le permite identificar una advertencia mediante el código CWE (enumeración de debilidad común). Cuando hace clic en el enlace, puede ver una descripción de este CWE en la red.
- Misra Igual que el anterior, pero para el estándar MISRA .
- Mensaje El texto del mensaje de diagnóstico.
- Proyecto Nombre del proyecto (puede deshabilitar esta columna usando un menú contextual).
- Archivo Nombre de archivo
- Línea Numero de linea. Importante! Tenga en cuenta que algunas líneas terminan con puntos. Ejemplo: "123 (...)". Al hacer clic en este número, obtendrá una lista de todas las líneas de código relacionadas con este mensaje. Al mismo tiempo, puede ir a cada una de las líneas de la lista.
Sí, fue agotador leerlo todo. Sin embargo, le aseguro que, una vez que haya comenzado a usarlo, se acostumbrará rápidamente a la herramienta. Y rara vez hará clic en algo para configurar.
Menú contextual
Por lo tanto, al hacer doble clic en el mensaje, va al fragmento de código correspondiente. Al hacer clic con el botón derecho del mouse, se abre el menú contextual.
El menú es bastante simple y no saturaré el artículo con la descripción de cada elemento. Si algo no está claro, puede consultar la documentación.
Sin embargo, me gustaría detenerme en una característica muy útil. ¿Recuerdas que en la configuración puedes agregar carpetas / archivos para ser excluidos? ¡La cosa es que agregar algo es mucho más simple de lo que parece!
Preste atención a la opción de menú "No verificar archivos y ocultar todos los mensajes de ...". Cuando hace clic en él, obtiene una lista de rutas que puede agregar a las excepciones (consulte la figura 6).
Figura 6. Excluyendo archivos de la verificación.Puede elegir un archivo separado o uno de los directorios. La imagen muestra que se elige la carpeta "SDL2-2.0.9 \ src \ haptic \ windows". Esto significa que todos los archivos de esta carpeta y todas las subcarpetas se excluirán del análisis. Además, todos los mensajes relacionados con estos archivos desaparecerán de la lista de inmediato. Muy conveniente No necesita reiniciar el análisis para eliminar todos los mensajes relacionados con las pruebas.
Modo de análisis incremental
La introducción a PVS-Studio será incompleta si ocultamos una de las características más importantes:
el análisis de código incremental .
Cuanto antes se detecte un error, menos costoso es eliminarlo. La mejor opción es resaltar los errores en el texto del programa editado de inmediato. Sin embargo, es técnicamente difícil y requiere muchos recursos. Es por eso que PVS-Studio se ejecuta en modo de fondo cuando el código fijo se compila correctamente. Al hacerlo, busca errores en el código que acaba de cambiar. El icono en el área de notificación del sistema indica que el análisis se está ejecutando.
Cuando se encuentra un error, aparece una ventana emergente que advierte del peligro (consulte la Figura 7).
Figura 7. Un mensaje emergente que informa que se han encontrado lugares sospechosos en los archivos editados.Si hace clic en el icono, abrirá el IDE con el resultado de la verificación del proyecto (consulte la Figura 2) y podrá buscar fragmentos de código sospechosos.
De hecho, es más fácil intentar trabajar en este modo que describirlo. Escribes el código como antes. Cuando sea necesario, el analizador lo molestará. Dale una oportunidad!
Usamos este modo todo el tiempo. Sí, a veces también cometemos errores de codificación. La capacidad de solucionarlos de inmediato reduce significativamente el tiempo para detectar el defecto y tratar de entender por qué el programa no se comporta como se esperaba. Es muy molesto pasar 15-20 minutos depurando para eventualmente encontrar un error tipográfico en el índice. Este es uno de los casos en que PVS-Studio encontró un error en PVS-Studio justo después de que apareciera en el código:
if (in[0] == '\\' && in[1] == '.' && in[1] == '\\') { in += 2; continue; }
Bueno, lo más interesante está por venir. El analizador PVS-Studio a veces puede ser mucho más útil que esto. Aquí está una de las revisiones sobre nuestro analizador: "
La experiencia de un usuario de trabajar con el analizador ". El texto me hace preguntarme.
Déjame resumirlo. El análisis incremental es algo que definitivamente deberías probar. Le encantará tan pronto como encuentre un par de errores en el nuevo código.
Capacidades PVS-Studio
Seamos breves. Es imposible describir sucintamente todos los diagnósticos disponibles en PVS-Studio. Puede encontrar una lista completa de diagnósticos y su descripción detallada en la documentación:
Descripción de errores detectados . Vamos a establecernos en la tabla en la que los diagnósticos se agrupan por tipo. Algunos diagnósticos están en más de un grupo. El hecho es que la clasificación es bastante formal. Por ejemplo, un error tipográfico puede resultar en el uso de memoria no inicializada. Algunos de los errores, por el contrario, no podían ajustarse a ninguno de los grupos, porque eran demasiado específicos. Sin embargo, esta tabla ofrece información sobre el funcionamiento del analizador de código estático.
Figura 8. Capacidades de PVS-Studio.Como puede ver, el analizador es especialmente útil en áreas como la búsqueda de errores de copiar y pegar. Es excelente para detectar problemas relacionados con la seguridad del código.
Para ver estos diagnósticos en acción, eche un vistazo a la
base de errores . Recopilamos todos los errores que hemos encontrado, verificando varios proyectos de código abierto con PVS-Studio.
SAST
PVS-Studio es una herramienta de prueba de seguridad de aplicaciones estáticas. El analizador puede detectar vulnerabilidades potenciales en el código del proyecto y mostrar el identificador de error apropiado en una determinada clasificación.
PVS-Studio admite las siguientes clasificaciones de error:
- CWE
- SEI CERT
- Misra
Puede habilitar la visualización de códigos CWE mediante el menú contextual en la ventana del analizador junto a la ruta Mostrar columnas> CWE
Figura 9. Menú contextual y el ejemplo de salida CWE.O en el menú principal (Extensiones> PVS-Studio> Mostrar códigos CWE en la ventana de salida)

Figura 10. Menú de extensión.Los diagnósticos MISRA se habilitan por separado en la configuración:

Figura 11. Una lista de errores detectados.Puede leer más sobre estas clasificaciones
aquí .
Verificación de proyectos desde la línea de comandos
PVS-Studio_Cmd.exe: una utilidad para verificar los proyectos de C ++ / C # Visual Studio (.vcxproj / .csproj) y las soluciones .sln desde la línea de comandos. Puede ser útil para automatizar el análisis. El programa se encuentra en el directorio donde se realizó la instalación; de forma predeterminada, es 'C: \ Archivos de programa (x86) \ PVS-Studio'.
El programa tiene muchos
parámetros , pero primero solo necesitamos 3 de ellos:
- --target: proyecto o archivo de solución que debe verificarse.
- --output: archivo de plog donde se debe escribir el informe.
- --progreso: muestra el progreso de un cheque.
Así se verá la carrera:

Figura 12. Salida del programa PVS-Studio_Cmd.exe.Después de ejecutar, obtendremos un archivo de plog con un informe, una ruta a la que especificamos en las opciones de ejecución. Puede convertir este informe en otros formatos utilizando la utilidad PlogConverter.exe. Para ver el informe en IDE, haga doble clic en un archivo de plog en el buscador.
También puede abrir el archivo de informe en el menú de extensión mediante la ruta Extensiones> PVS-Studio> Abrir / Guardar> Abrir informe de análisis ...
Puede encontrar información detallada sobre la utilidad y sus parámetros en la
documentación .
Supresión de falsos positivos
Algunos mensajes emitidos por el analizador serán inevitablemente falsos. No hay nada que podamos hacer al respecto. Un analizador estático es solo un programa que no tiene inteligencia artificial y no puede determinar si es un error real o no.
Para luchar contra los falsos positivos, el analizador proporciona un conjunto de mecanismos diferentes. Se detallan en las siguientes secciones de documentación:
- Afinacion fina .
- Un método aproximado que solo le permite trabajar con advertencias relacionadas con código nuevo o modificado.
Conclusión
Por supuesto, no le contamos todo sobre la herramienta. Si le cuento todo, el artículo se convertirá en documentación. El objetivo era mostrar lo fácil que es trabajar con la herramienta dentro del entorno de Visual Studio. Puede leer sobre otros entornos y modos de trabajo en la documentación y otros artículos en nuestro
sitio web . Por cierto, hay muchas cosas interesantes para los programadores. Ven y espera.
Vale la pena señalar que PVS-Studio no solo funciona en el entorno de Microsoft. También admitimos el lenguaje Java, podemos trabajar en Linux y macOS, integrarnos en CMake y mucho más. Puede encontrar más información en la
documentación .
Le deseo un código incorrecto sin errores y espero que disfrute de PVS-Studio. Si tiene alguna pregunta, siempre le ayudaremos y le daremos consejos.
EscríbenosEnlaces adicionales:
- Revisión de código .
- Análisis de código estático .
- Herramientas de análisis de código estático .
- SAST .
- Tecnologías utilizadas en el analizador PVS-Studio .
- Descargue y pruebe PVS-Studio.
- Soporte de Visual Studio 2019 .
- Discuta el precio del analizador PVS-Studio para su equipo y cómo comprarlo: compre PVS-Studio .
- Ejemplo de uso de un analizador estático .
- Respuestas a preguntas que a menudo se hacen en conferencias.
- Cómo ejecutar PVS-Studio Java
- Cómo ejecutar PVS-Studio en Linux y macOS