Análisis estático: desde la introducción hasta la integración

Cansado de revisar o depurar códigos interminables, a veces piensas en cómo simplificar tu vida. Y después de buscar un poco, o tropezar con él accidentalmente, puedes ver la frase mágica: “Análisis estático”. Veamos qué es y cómo puede interactuar con tu proyecto.

Análisis estático: desde la introducción hasta la integración
De hecho, si escribes en cualquier idioma moderno, entonces, sin siquiera darte cuenta, lo pasas por un analizador estático. El hecho es que cualquier compilador moderno proporciona, aunque sea un pequeño, conjunto de advertencias sobre posibles problemas en el código. Por ejemplo, al compilar código C++ en Visual Studio, es posible que vea lo siguiente:

Análisis estático: desde la introducción hasta la integración
En esta salida vemos que la variable var nunca se usó en ninguna parte de la función. Entonces, en realidad, casi siempre usaste un analizador de código estático simple. Sin embargo, a diferencia de los analizadores profesionales como Coverity, Klocwork o PVS-Studio, las advertencias proporcionadas por el compilador pueden indicar sólo una pequeña gama de problemas.

Si no sabes con certeza qué es el análisis estático y cómo implementarlo, Lee este artículopara conocer más sobre esta metodología.

¿Por qué necesita análisis estático?

En pocas palabras: aceleración y simplificación.

El análisis estático le permite encontrar muchos problemas diferentes en el código: desde el uso incorrecto de construcciones del lenguaje hasta errores tipográficos. Por ejemplo, en lugar de

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Escribiste el siguiente código:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

Como puede ver, hay un error tipográfico en la última línea. Por ejemplo, PVS-Studio emite la siguiente advertencia:

V537 Considere revisar la exactitud del uso del elemento "y".

Si quiere meterse en este error, pruebe con un ejemplo ya preparado en Compiler Explorer: *клик*.

Y como comprenderás, no siempre es posible prestar atención a esas secciones del código de inmediato y, debido a esto, puedes sentarte a depurar durante una buena hora, preguntándote por qué todo funciona de manera tan extraña.

Sin embargo, esto es claramente un error. ¿Qué pasa si el desarrollador escribió un código subóptimo porque olvidó algunas sutilezas del lenguaje? O incluso lo permitió en el código. comportamiento indefinido? Desafortunadamente, estos casos son completamente comunes y la mayor parte del tiempo se dedica a depurar código de trabajo específico que contiene errores tipográficos, errores típicos o comportamientos indefinidos.

Es por estas situaciones que apareció el análisis estático. Este es un asistente para el desarrollador que señalará varios problemas en el código y explicará en la documentación por qué no es necesario escribir de esta manera, a qué puede conducir y cómo solucionarlo. A continuación se muestra un ejemplo de cómo podría verse: *клик*.

Puedes encontrar errores más interesantes que el analizador puede detectar en los artículos:

Ahora que ha leído este material y está convencido de los beneficios del análisis estático, quizás quiera probarlo. ¿Pero por dónde empezar? ¿Cómo integrar una nueva herramienta en su proyecto actual? ¿Y cómo presentarle al equipo? Encontrará respuestas a estas preguntas a continuación.

Nota. El análisis estático no reemplaza ni cancela algo tan útil como las revisiones de código. Complementa este proceso, ayudando a detectar y corregir con antelación errores tipográficos, imprecisiones y diseños peligrosos. Es mucho más productivo centrarse en revisiones de código sobre algoritmos y claridad del código, en lugar de buscar un paréntesis fuera de lugar o leer funciones de comparación aburridas.

0. Conociendo la herramienta

Todo comienza con una versión de prueba. De hecho, es difícil decidir introducir algo en el proceso de desarrollo si nunca antes has visto la herramienta en vivo. Por tanto, lo primero que debes hacer es descargar versión de prueba.

Qué aprenderás en esta etapa:

  • ¿Cuáles son las formas de interactuar con el analizador?
  • ¿Es el analizador compatible con su entorno de desarrollo?
  • ¿Qué problemas hay actualmente en sus proyectos?

Una vez que hayas instalado todo lo necesario, lo primero que debes hacer es ejecutar un análisis de todo el proyecto (Windows, Linux, macOS). En el caso de PVS-Studio en Visual Studio verá una imagen similar (en la que se puede hacer clic):

Análisis estático: desde la introducción hasta la integración
El hecho es que los analizadores estáticos suelen emitir una gran cantidad de advertencias para proyectos con una base de código grande. No es necesario solucionarlos todos, ya que su proyecto ya está funcionando, lo que significa que estos problemas no son críticos. Sin embargo, tu puedes mirar las advertencias más interesantes y corregirlos si es necesario. Para hacer esto, necesita filtrar la salida y dejar solo los mensajes más confiables. En el complemento PVS-Studio para Visual Studio, esto se hace filtrando por categorías y niveles de error. Para obtener resultados más precisos, deje solo Alta и General (también se puede hacer clic):

Análisis estático: desde la introducción hasta la integración
De hecho, 178 advertencias son mucho más fáciles de ver que varios miles...

en pestañas Medio и Baja A menudo hay buenas advertencias, pero estas categorías incluyen aquellos diagnósticos que tienen menos precisión (confiabilidad). Puede encontrar más información sobre los niveles de advertencia y las opciones para trabajar en Windows aquí: *клик*.

Vale la pena haber revisado con éxito los errores más interesantes (y corregidos con éxito). suprimir las advertencias restantes. Esto es necesario para que las nuevas advertencias no se pierdan entre las antiguas. Además, un analizador estático es un asistente del programador y no una lista de errores. 🙂

1. Automatización

Después de familiarizarse, es hora de configurar los complementos e integrarlos en CI. Esto debe hacerse antes de que los programadores comiencen a utilizar el analizador estático. El hecho es que el programador puede olvidarse de habilitar el análisis o no querer hacerlo en absoluto. Para hacer esto, debe realizar una verificación final de todo para que el código no probado no pueda ingresar a la rama de desarrollo general.

Qué aprenderás en esta etapa:

  • ¿Qué opciones de automatización ofrece la herramienta?
  • ¿Es el analizador compatible con su sistema de montaje?

Como no existe una documentación perfecta, a veces hay que escribir apoyar. Esto es normal y estaremos encantados de ayudarle. 🙂

Pasemos ahora a los servicios de integración continua (CI). En ellos se puede implementar cualquier analizador sin problemas graves. Para hacer esto, necesita crear una etapa separada en la canalización, que generalmente se encuentra después de la compilación y las pruebas unitarias. Esto se hace utilizando varias utilidades de la consola. Por ejemplo, PVS-Studio proporciona las siguientes utilidades:

Para integrar el análisis en la CI, es necesario hacer tres cosas:

  • Instale el analizador;
  • Ejecutar análisis;
  • Entregar resultados.

Por ejemplo, para instalar PVS-Studio en Linux (base Debian), necesita ejecutar los siguientes comandos:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

En sistemas que ejecutan Windows, no hay forma de instalar el analizador desde el administrador de paquetes, pero es posible implementar el analizador desde la línea de comando:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Puede leer más sobre la implementación de PVS-Studio en sistemas que ejecutan Windows *aquí*.

Después de la instalación, debe ejecutar el análisis directamente. Sin embargo, se recomienda hacer esto sólo después de que la compilación y las pruebas hayan pasado. Esto se debe a que el análisis estático suele tardar el doble que la compilación.

Dado que el método de inicio depende de la plataforma y las características del proyecto, mostraré la opción para C++ (Linux) como ejemplo:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

El primer comando realizará el análisis, y el segundo sobresconvierte el informe a formato de texto, lo muestra en la pantalla y devuelve un código de retorno distinto de 0 si hay advertencias. Un mecanismo como este puede usarse convenientemente para bloquear una compilación cuando hay mensajes de error. Sin embargo, siempre puedes quitar la bandera. -w y no bloquee un ensamblado que contenga advertencias.

Nota. El formato del texto es inconveniente. Se proporciona simplemente como ejemplo. Preste atención a un formato de informe más interesante: FullHtml. Le permite navegar a través del código.

Puede leer más sobre cómo configurar el análisis en CI en el artículo "PVS-Studio y la integración continua" (Windows) o "Cómo configurar PVS-Studio en Travis CI"(Linux).

Bien, ha configurado el analizador en el servidor de compilación. Ahora, si alguien cargó código no probado, la etapa de verificación fallará y usted podrá detectar el problema, sin embargo, esto no es del todo conveniente, ya que es más eficiente verificar el proyecto no después de que se hayan fusionado las ramas, sino antes, en la etapa de solicitud de extracción.

En general, configurar un análisis de solicitud de extracción no es muy diferente del lanzamiento habitual de un análisis en CI. Excepto por la necesidad de obtener una lista de archivos modificados. Por lo general, estos se pueden obtener consultando las diferencias entre ramas usando git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Ahora necesita pasar esta lista de archivos al analizador como entrada. Por ejemplo, en PVS-Studio esto se implementa usando la bandera -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Puede obtener más información sobre el análisis de solicitudes de extracción *aquí*. Incluso si su CI no está en la lista de servicios mencionados en el artículo, le resultará útil la sección general dedicada a la teoría de este tipo de análisis.

Al configurar el análisis de las solicitudes de extracción, puede bloquear las confirmaciones que contienen advertencias, creando así un límite que el código no probado no puede cruzar.

Ciertamente todo esto es bueno, pero me gustaría poder ver todas las advertencias en un solo lugar. No sólo del analizador estático, sino también de pruebas unitarias o del analizador dinámico. Existen varios servicios y complementos para esto. PVS-Studio, por ejemplo, tiene complemento para la integración en SonarQube.

2. Integración en máquinas de desarrollador

Ahora es el momento de instalar y configurar el analizador para el uso diario en desarrollo. A estas alturas ya te habrás familiarizado con la mayoría de las formas de trabajar, por lo que esta puede considerarse la parte más fácil.

Como opción más sencilla, los desarrolladores pueden instalar ellos mismos el analizador necesario. Sin embargo, esto llevará mucho tiempo y los distraerá del desarrollo, por lo que puedes automatizar este proceso usando un instalador y las opciones necesarias. Para PVS-Studio hay varios banderas para instalación automatizada. Sin embargo, siempre existen gestores de paquetes, por ejemplo, Chocolatey (Windows), Homebrew (macOS) o decenas de opciones para Linux.

Luego deberá instalar los complementos necesarios, por ejemplo para Visual Studio, IDEA, Jinete etc.

3. Uso diario

En esta etapa, es hora de decir algunas palabras sobre las formas de acelerar el analizador durante el uso diario. Un análisis completo de todo el proyecto lleva mucho tiempo, pero ¿con qué frecuencia cambiamos el código de todo el proyecto a la vez? Casi no hay refactorización que sea tan grande que afecte inmediatamente a toda la base del código. La cantidad de archivos que se modifican a la vez rara vez supera la docena, por lo que tiene sentido analizarlos. Para tal situación existe modo de análisis incremental. No se alarme, esta no es una herramienta más. Este es un modo especial que le permite analizar solo archivos modificados y sus dependencias, y esto sucede automáticamente después de la compilación si está trabajando en un IDE con el complemento instalado.

Si el analizador detecta problemas en el código modificado recientemente, lo informará de forma independiente. Por ejemplo, PVS-Studio le informará sobre esto mediante una alerta:

Análisis estático: desde la introducción hasta la integración
Por supuesto, no basta con decirles a los desarrolladores que utilicen la herramienta. Necesitamos de alguna manera decirles qué es y cómo es. Aquí, por ejemplo, hay artículos sobre un inicio rápido para PVS-Studio, pero puede encontrar tutoriales similares para cualquier herramienta que prefiera:

Estos artículos proporcionan toda la información necesaria para el uso diario y no requieren mucho tiempo. 🙂

Incluso en la etapa de conocer la herramienta, suprimimos muchas advertencias durante uno de los primeros lanzamientos. Desafortunadamente, los analizadores estáticos no son perfectos, por lo que de vez en cuando dan falsos positivos. Generalmente es fácil suprimirlos; por ejemplo, en el complemento PVS-Studio para Visual Studio solo necesitas hacer clic en un botón:

Análisis estático: desde la introducción hasta la integración
Sin embargo, puedes hacer más que simplemente suprimirlos. Por ejemplo, puede informar un problema al soporte. Si el falso positivo se puede corregir, en futuras actualizaciones podrá notar que cada vez hay menos falsos positivos específicos de su código base.

Después de la integración

Así que hemos pasado por todas las etapas para integrar el análisis estático en el proceso de desarrollo. A pesar de la importancia de configurar este tipo de herramientas en CI, el lugar más importante para ejecutarlas es la computadora del desarrollador. Después de todo, un analizador estático no es un juez que dice en algún lugar lejano que el código no es bueno. Al contrario, es un asistente que te avisa si estás cansado y te recuerda si has olvidado algo.

Es cierto que sin un uso regular, es poco probable que el análisis estático simplifique significativamente el desarrollo. Después de todo, su principal beneficio para un desarrollador no radica tanto en la búsqueda de secciones de código complejas y controvertidas, sino en su detección temprana. Esté de acuerdo en que descubrir un problema después de enviar las ediciones para su prueba no sólo es desagradable, sino que también requiere mucho tiempo. El análisis estático, cuando se utiliza con regularidad, analiza cada cambio directamente en su computadora e informa lugares sospechosos mientras trabaja en el código.

Y si usted o sus colegas aún no están seguros de si vale la pena implementar el analizador, le sugiero que comience a leer el artículo "Razones para introducir el analizador de código estático PVS-Studio en el proceso de desarrollo". Aborda las preocupaciones típicas de los desarrolladores de que el análisis estático les quitará tiempo, etc.

Análisis estático: desde la introducción hasta la integración

Si desea compartir este artículo con una audiencia de habla inglesa, utilice el enlace de traducción: Maxim Zvyagintsev. Análisis estático: desde los inicios hasta la integración.

Fuente: habr.com

Añadir un comentario