¿Qué es el análisis estático?
El análisis estático es el análisis automatizado del código fuente sin ejecutar la aplicación.
Si el análisis se lleva a cabo durante la ejecución del programa, se denomina análisis dinámico.
El análisis estático se utiliza con frecuencia para detectar lo siguiente:
Brechas de seguridad. Problemas de rendimiento. Incumplimiento de las normas. Uso de construcciones de programación obsoletas. ¿Cómo funciona una herramienta de análisis estático? El concepto básico común a todas las herramientas de análisis estático consiste en buscar en el código fuente determinados patrones de codificación a los que se asigna una advertencia o información.
Dies könnte so einfach sein wie „JUnit 5-Testklassen müssen nicht 'öffentlich' sein“. Oder etwas, das komplex zu identifizieren ist, wie „Nicht vertrauenswürdige Zeichenketteningabe, die in einer SQL-Ausführungsanweisung verwendet wird“.
Las herramientas de análisis estático difieren en la forma en que implementan esta funcionalidad.
Tecnología de análisis de código fuente para la creación de un árbol sintáctico abstracto (AST). Comparación de texto con expresiones regulares, una combinación de lo anterior. La comparación de expresiones regulares en texto es muy flexible, es fácil escribir reglas para la comparación, pero a menudo puede dar lugar a muchos resultados falsos positivos, y las reglas de comparación no conocen el contexto del código circundante.
El AST-Matching trata el código fuente como código de programa y no solo como archivos llenos de texto. Esto permite una comparación más específica y contextualizada, y puede reducir el número de falsos positivos que se notifican contra el código.
Análisis estático en integración continua Los análisis estáticos se suelen realizar durante el proceso de integración continua (CI) para generar un informe sobre los problemas de cumplimiento que se puede revisar con el fin de obtener una visión general objetiva de la base de código a lo largo del tiempo.
Algunos usuarios utilizan el análisis estático como medida objetiva de la calidad de su código, configurando la herramienta de análisis estático para que solo se midan determinadas partes del código y solo se informe sobre un subconjunto de reglas.
La objetividad está garantizada por las reglas utilizadas, ya que estas no cambian con el tiempo en su evaluación del código. Es evidente que la combinación de las reglas utilizadas y su configuración es una decisión subjetiva, y diferentes equipos optan por utilizar diferentes reglas en diferentes momentos.
Es útil realizar el análisis estático en CI, pero puede retrasar la retroalimentación al programador. Los programadores no reciben retroalimentación durante la programación, sino más tarde, cuando el código pasa por la herramienta de análisis estático. Otro efecto secundario de la ejecución del análisis estático en CI es que los resultados son más fáciles de ignorar.
Para que los equipos presten más atención a los resultados del análisis estático, normalmente es posible configurar una métrica de umbral en el proceso de compilación, de modo que la compilación falle si se supera la métrica, por ejemplo, una serie de reglas activadas.
Análisis estático en el IDE Para obtener comentarios más rápidamente, existen muchos complementos IDE que ejecutan las reglas del análisis estático en el IDE cuando es necesario o a intervalos regulares, cuando cambia el código.
Las infracciones de las reglas pueden mostrarse en el IDE mientras el programador escribe el código. Para dificultar el incumplimiento de las reglas, las infracciones a menudo pueden configurarse para que se muestren en el editor como código subrayado.
Personalmente, creo que es un método útil para mejorar mi código, especialmente cuando trabajo con una nueva biblioteca cubierta por la herramienta de análisis estático. Sin embargo, puede resultar «ruidoso» en caso de falsos positivos o reglas que no le interesen. No obstante, esto se soluciona dando un paso adicional para configurar la herramienta de análisis estático de modo que se ignoren determinadas reglas.
Corrección de código basada en reglas de análisis estático En la mayoría de las herramientas de análisis estático, la corrección de la regla queda a cargo del programador, por lo que este debe comprender la causa de la infracción de la regla y saber cómo solucionarla.
Muy pocas herramientas de análisis estático ofrecen también la posibilidad de corregir las infracciones, ya que la corrección suele depender del equipo, la tecnología utilizada y los estilos de codificación acordados.
Reglas estándar Se puede generar una confianza errónea en la calidad de las reglas cuando las herramientas de análisis estático están equipadas con reglas estándar. Es tentador creer que cubren todos los problemas con los que podría encontrarse un programador y todas las circunstancias en las que debería aplicarse la regla. A veces, las circunstancias en las que debería aplicarse una regla son sutiles y pueden no ser fáciles de detectar.
Existe la esperanza de que, mediante el uso de una herramienta de análisis estático y un examen más detallado de las reglas y las infracciones, los programadores desarrollen la capacidad de reconocer y evitar el problema en el contexto de su dominio específico.
Si el dominio requiere reglas de contexto, es posible que las herramientas de análisis estático no dispongan de reglas que se ajusten a su dominio o biblioteca y, además, estas herramientas suelen ser difíciles de configurar y ampliar.
Molestias Ninguno de estos «molestias» es insuperable:
falso positivo Falta de correcciones Configuración para ignorar reglas Añadir reglas específicas del contexto Sin embargo, a menudo se utilizan como excusas para evitar desde el principio el uso de herramientas de análisis estático, lo cual es una lástima, ya que el uso del análisis estático puede ser extremadamente útil para:
Destacar mejores enfoques para los desarrolladores jóvenes. Reciba comentarios rápidos sobre infracciones claras de codificación. Identifique problemas oscuros con los que el programador nunca se ha encontrado. Confirmar que el programador ha elegido un buen enfoque de codificación (siempre que no se hayan notificado infracciones). Herramientas de análisis estático basadas en IDE Como colaborador individual en un proyecto, me gusta utilizar herramientas de análisis estático que se ejecutan en el IDE, lo que me permite obtener una respuesta rápida sobre mi código.
Esto complementa cualquier proceso de revisión de solicitudes de extracción y la integración de CI que pueda tener un proyecto.
Intento encontrar herramientas que me proporcionen una ventaja y mejoren mi flujo de trabajo individual.
Cuando las herramientas se ejecutan en el IDE, puede resultar tentador considerarlas sinónimos, ya que suelen utilizar la misma interfaz gráfica de usuario básica y el mismo enfoque de configuración.
Las herramientas pueden tener funciones o conjuntos de reglas que se superponen, pero para obtener el máximo beneficio, instalo varias herramientas para aprovechar sus puntos fuertes.
Las herramientas IDE para análisis estáticos que utilizo activamente al programar se enumeran a continuación:
Las inspecciones integradas de IntelliJ: patrones de codificación habituales SpotBugs — errores frecuentes SonarLint: patrones generales de uso CheckStyle: patrones de estilo habituales Sensei Secure Code Warrior creación de reglas personalizadas Las utilizo todas porque funcionan bien juntas, se complementan y se complementan entre sí.
Inspecciones de IntelliJ Si utiliza IntelliJ, ya está utilizando sus inspecciones.
Estas son reglas para análisis estáticos que se marcan en el IDE. Algunas de ellas también disponen de opciones QuickFix con las que se puede reescribir el código para solucionar el problema.
Las reglas se pueden activar y desactivar, y puede seleccionar el nivel de error con el que se resaltan en el IDE.
Hay muchas inspecciones buenas en IntelliJ. Lo sé porque las he leído mientras escribo esto. Utilizo las inspecciones de IntelliJ como valores predeterminados y no las he configurado, pero para sacar el máximo partido a las inspecciones, debe leerlas, identificar las que son relevantes para su estilo de codificación y configurar el nivel de advertencia para que las note en el código.
Lo mejor de las inspecciones de IntelliJ es que están incluidas de forma gratuita en el IDE y ayudan a desarrollar la memoria muscular de:
Detección de advertencias y errores en el código fuente mientras se escribe el código. Mueva el puntero del ratón sobre el código marcado para conocer las infracciones de las normas. Utilice Alt+Intro para aplicar una solución rápida al problema.
Detectar errores Detectar errores El complemento IntelliJ utiliza el análisis estático para alertarle sobre errores en su código.
SpotBugs se pueden configurar en los ajustes de IntelliJ para que se analice su código. Las reglas que se utilizan realmente se encuentran en la pestaña Detector.
Suelo utilizar SpotBugs después de escribir y revisar mi código. A continuación, ejecuto la opción «Analizar archivos de proyecto, incluidas las fuentes de prueba».
Esto me ayuda a identificar errores, código obsoleto y optimizaciones obvias. También me obliga a investigar algunas de las infracciones notificadas para ayudarme a decidir qué hacer.
SpotBugs detecta problemas, pero no ofrece acciones QuickFix para intentar resolverlos.
SpotBugs es fácil de configurar y lo considero una segunda opinión objetiva y útil que puedo obtener en mi IDE.
Sonar Lint El complemento Sonar Lint .
SonarLint se puede configurar en los ajustes de IntelliJ para seleccionar las reglas según las cuales se valida el código.
De forma predeterminada, SonarLint se ejecuta en tiempo real y muestra los problemas del código actual que está editando.
SonarLint no ofrece soluciones rápidas, pero la documentación relacionada con los informes de infracciones suele ser clara y estar bien documentada.
En el pasado, SonarLint me ha resultado útil para informarme sobre nuevas funciones de Java que no conocía en las versiones más recientes de Java.
Seguir comprobando Comprobar el estilo El complemento ofrece una combinación de reglas de formato y calidad del código.
El complemento CheckStyle se suministra en un paquete con «Sun Checks» y «Google Checks».
Las definiciones de estos términos se pueden encontrar fácilmente en Internet .
CheckStyle ofrece el mayor valor añadido cuando un proyecto ha dedicado tiempo a crear su propio conjunto de reglas. Entonces, el complemento IDE se puede configurar para que utilice este conjunto de reglas y los programadores pueden realizar un análisis antes de transferir el código a CI.
CheckStyle se utiliza muy a menudo como complemento de fallo de compilación para procesos de CI cuando el número de infracciones de CheckStyle supera un umbral determinado.
Sensei Sensei utiliza un análisis estático basado en un árbol sintáctico abstracto (AST) para comparar código y crear QuickFixes. Esto permite identificar de forma muy específica el código que presenta problemas.
El AST permite a QuickFixes, que están asignados a una receta, comprender el código circundante, por ejemplo, cuando se añade una nueva clase al código, cada importación para esta clase se añade solo una vez al archivo fuente y no para cada sustitución.
Sensei desarrollado para facilitar la creación de reglas de coincidencia personalizadas que podrían no existir en otras herramientas o que serían difíciles de configurar.
En lugar de modificar un archivo de configuración, toda la configuración se puede realizar en la interfaz gráfica de usuario. Al crear nuevas recetas, la interfaz gráfica de usuario permite identificar fácilmente a qué código se adapta la receta. Y al definir las soluciones rápidas, se puede comparar inmediatamente el estado del código antes y después. Esto facilita la creación de recetas muy contextuales, es decir, específicas para equipos, tecnologías e incluso programadores individuales.
Utilizo Sensei combinación con otras herramientas de análisis estático, por ejemplo, la mayoría de las herramientas de análisis estático detectan problemas, pero no los solucionan. Un caso de uso frecuente de Sensei Sensei la búsqueda adecuada de la otra herramienta en Sensei y ampliarla con una solución rápida. Esto tiene la ventaja de que la solución personalizada aplicada ya cumple con los estándares de codificación de su proyecto.
Periódicamente creo Sensei que ya están incluidas en el conjunto IntelliJ Intensions, porque el informe Intension no se ajusta del todo al contexto que he creado o porque la solución rápida proporcionada por IntelliJ no se ajusta al patrón de código que quiero utilizar.
Complemento las herramientas existentes, en lugar de intentar sustituirlas por completo.
Sensei también Sensei ser muy útil si identifica una variante contextual de una regla general, por ejemplo, si utiliza una biblioteca SQL que no es compatible con la herramienta de análisis estático, pero las reglas SQL generales del motor de análisis estático siguen siendo válidas, entonces puede utilizar Sensei para crear variantes Sensei de estas reglas.
Sensei no Sensei muchas recetas genéricas como las herramientas de análisis estático mencionadas. Su punto fuerte es que facilita la creación de nuevas recetas, completas con QuickFixes configuradas para adaptarse a su estilo de codificación específico y a sus casos de uso.
NOTA: Estamos trabajando en un archivo público con recetas para cubrir casos de uso genéricos, y lo encontrarás aquí .
Resumen Tiendo a elegir herramientas que funcionen juntas, sean configurables y fáciles de ampliar para adaptarse a mi contexto específico. Llevo años utilizando herramientas de análisis estático en el IDE para identificar problemas y aprender más sobre los lenguajes de programación y las bibliotecas que utilizo.
Utilizo todas las herramientas mencionadas en combinación:
IntelliJ Intentions ayuda a detectar inmediatamente los problemas de código más frecuentes, a menudo con las soluciones rápidas correspondientes. SpotBugs encuentra errores sencillos que quizá se me hayan pasado por alto y me avisa de problemas de rendimiento. SonarLint identifica funciones Java que yo desconocía y me pide que modele mi código adicionalmente. CheckStyle me ayuda a mantener un estilo de codificación acordado, que también se aplica durante la integración continua. Sensei me Sensei a crear QuickFixes para ampliar escenarios comunes que se encuentran con herramientas de análisis estático y a crear recetas específicas para proyectos o tecnologías que son difíciles de configurar en otras herramientas.
---
Instale Sensei IntelliJ con «Preferences\ Plugins» (Mac) o «Settings\ Plugins» (Windows) y, a continuación, busqueSensei Code».
Encontrará un repositorio con código de ejemplo y recetas para casos de uso habituales en la cuenta de GitHub de Secure Code Warrior proyectosensei».
https://github.com/securecodewarrior/sensei-blog-examples
Más información sobre Sensei