¿Qué es el análisis de código?

Probablemente todos los que están involucrados en el desarrollo de software entienden lo importante que es la calidad del código. Afecta a lo fácil que es mantener el código, entenderlo añadir nuevas características, y por supuesto, la calidad del código tiene un impacto significativo en la calidad del software. Dado que casi todos los desarrolladores tienen su propia opinión sobre lo que significa la calidad del código, la pregunta “¿Qué es la calidad del software?” puede provocar acalorados debates. A pesar de ello, hay algunas normas generalmente aceptadas a las que la mayoría de los desarrolladores intentan atenerse, como la claridad, sencillez y elegancia de su código (para que alguien que no sea el autor pueda mantenerlo y entenderlo), la facilidad con la que se puede ampliar el código, su rendimiento, etc. Una de las formas de conseguir una buena calidad es utilizar analizadores de código. Entonces, ¿en qué consisten todos estos analizadores?

En realidad, el nombre habla por sí mismo; este tipo de herramientas se utilizan para inspeccionar el código y reportar información sobre su calidad, por ejemplo, si se han encontrado violaciones de las normas de programación y diseño, datos sobre la complejidad del código, etc. El análisis del código fuente puede ser tanto estático como dinámico. El estático se realiza sin ejecutar realmente el código. Este tipo de software escanea todo el código de un proyecto para encontrar vulnerabilidades, lo valida frente a las mejores prácticas de la industria y también ofrece la posibilidad de validarlo frente a las reglas de codificación de la empresa, etc. Este análisis también puede realizarse como parte de una revisión del código. Después del análisis estático se puede utilizar el dinámico para descubrir defectos más sutiles. Utiliza el enfoque opuesto y supone un análisis basado en la ejecución. El enfoque más común es la ejecución de pruebas unitarias.

La combinación de estos tipos de análisis debería ayudar a encontrar cerca del 95% de los fallos, siempre que el análisis lo realice una persona que entienda el código fuente. Sin embargo, ambos tienen sus propios puntos débiles. Por ejemplo, los analizadores de código no entienden la intención del autor del código y pueden informar de falsos positivos (una posible vulnerabilidad que en realidad no existe), o de falsos negativos (a la inversa, cuando existe una vulnerabilidad pero la herramienta no informa sobre ella). Tampoco puede garantizar la cobertura total de las pruebas del código fuente y no puede comprobar la corrección de una operación del código (es decir, no puede verificar que su código funciona como espera su cliente).

Como empresa de desarrollo .NET, tenemos mucha experiencia con diferentes herramientas que mejoran el código. En este artículo, nos centraremos en los analizadores de código estático, y también consideraremos NDepend, una herramienta de análisis estático para código gestionado .NET

Cómo elegir un analizador estático

Imaginemos que decide utilizar una herramienta de análisis estático. La elección de la herramienta adecuada es siempre un proceso individual. Algunos desarrolladores utilizan analizadores estáticos integrados en su IDE, otros prefieren soluciones de terceros. A continuación le indicamos algunos aspectos comunes que debe tener en cuenta a la hora de decidir qué herramienta es la más adecuada para usted:

  1. En primer lugar, busque sólo aquellas herramientas que sean compatibles con el lenguaje de programación y el IDE que elija.
  2. No dude en buscar en las reseñas de estas herramientas y probarlas un poco – de esta manera podrá asegurarse de que la solución elegida es tan buena, como usted necesita.
  3. Compruebe la capacidad de la herramienta para definir fácilmente reglas adicionales para que la herramienta pueda hacer cumplir las políticas de codificación internas.
  4. Examine el modelo de precios de cada herramienta.
  5. Piense en lo que necesita de la herramienta y elimine de su consideración aquellas que no le proporcionen dicha funcionalidad. Por ejemplo, algunas de las herramientas se centran únicamente en la calidad del código, por lo que, si su objetivo es comprobar también la seguridad, obviamente no son su elección.
  6. El grado de actualización de la herramienta. Constantemente surgen nuevos problemas y debe estar seguro de que los autores de la herramienta seleccionada la actualizan con regularidad.

Tenga en cuenta que utilizar sólo analizadores estáticos no es una salida. En primer lugar, unos procesos sólidos pueden garantizar la seguridad de la aplicación y la calidad del código desde el principio. Aparte de esto, también necesita a alguien que pueda revisar los resultados de los análisis y decidir qué debe hacerse cuando se encuentren problemas

Redwerk proporciona un desarrollo de ciclo completo desde el concepto inicial hasta una solución en vivo y estamos muy atentos a la calidad del código. Por eso, cuando recibimos una petición de Patrick Smacchia, el desarrollador principal de NDepend, para que probáramos su herramienta, estuvimos de acuerdo con esta propuesta y, como resultado, decidimos también ofrecer una visión general de esta herramienta. En el momento de escribir el artículo, la versión de NDepend era la 1.9.

analizador de código gestionado de .NET – NDepend

La herramienta NDepend admite un gran número de métricas de código, incluidos los gráficos de dependencia y la matriz de dependencia para explorar la estructura del código. Revisaremos el programa independiente UI NDepend Professional. Aparte de éste, NDepend ofrece una serie de variantes de integración:

  1. Extensión de Visual Studio.
  2. Un ejecutable de consola, que se utiliza para ejecutar un análisis con NDepend y construir un informe. Toma argumentos de la línea de comandos y el único parámetro obligatorio es una ruta absoluta al archivo de proyecto de NDepend que define la base de código a analizar.
  3. PowerTools es un conjunto de pequeños programas basados en NDepend.API. Son de código abierto y se utilizan para demostrar la sintaxis y las capacidades de la API de NDepend.
  4. Extensión de Azure DevOps y TFS.
  5. Plugin NDepend TeamCity.
  6. No existe una integración con Jenkins, Atlassian Bamboo y AppVeyor como, por ejemplo, existe para Azure, pero es posible integrarse con ellos a través de NDepend.Console.exe.
  7. Integración de SonarQube.
  8. Integración de CruiseControl.NET.
  9. Integración de FinalBuilder.
  10. Integración de Reflector.
  11. También puede importar archivos de resultados de cobertura de OpenCover, JetBrains DotCover o NCover (3.X y superior) al proyecto NDepend.

Como puede ver, NDepend proporciona amplias variantes de su uso. También proporcionan una prueba gratuita con un lote de las funcionalidades de la edición profesional. En este artículo, trataremos de proporcionar una guía paso a paso de cómo trabajar con NDepend y, esperamos, que esto ayude a los lectores a decidir si actualmente es adecuado para sus proyectos actuales o no. Como consejo, si cree que no necesita una herramienta de este tipo en este momento, puede revisar NDepend de todos modos, porque cuando necesite algún analizador estático, reducirá el tiempo de búsqueda de una herramienta útil.

Proceso de instalación y primer lanzamiento

NDepend se distribuye como un archivo .zip. Es una cuestión controvertida, qué es mejor: proporcionar un instalador MSI o un archivo .zip. Ambas variantes tienen pros y contras y tendrán sus partidarios. De todos modos, por la variante actual de distribución, el proceso de instalación de NDepend es bastante sencillo, sólo tiene que descomprimir los archivos en una carpeta de la aplicación en su máquina. La única observación es que no se recomienda descomprimir los archivos en la carpeta ‘%ProgramFiles%\NDepend’. Esto puede causar problemas debido a la protección de Windows. En el primer lanzamiento, necesita introducir su clave de licencia y después de eso, verá la pantalla principal, donde puede instalar la extensión necesaria (para Visual Studio, Azure DevOps, etc) y crear un proyecto para analizar. La siguiente captura de pantalla ilustra la pantalla principal de la herramienta.Ndepend tool - main screen

La interfaz es bastante sencilla y recuerda a la de Visual Studio. Y esto no es una coincidencia, porque las pieles de NDepend contienen una serie de pieles de Visual Studio, MS Office y DevExpress, incluyendo incluso la opción de cambiar el texto del menú de mayúsculas a minúsculas

Dado que revisamos el programa independiente, necesitamos crear un nuevo proyecto NDepend. Para los fines de este artículo, emplearemos nuestro proyecto de prueba, utilizado para mostrar ejemplos para uno de los artículos anteriores. El proceso de creación es bastante estándar y sencillo: sólo tiene que proporcionar un nombre de proyecto, su ubicación y el nombre del archivo. Después de esto, verá un panel de propiedades del proyecto, a través del cual podrá elegir los ensamblajes y establecer las opciones de análisis necesarias.

Revisemos estas opciones de análisis una por una para hacernos una idea general de las opciones que puede configurar:

  1. La pes taña “Código a analizar ” le permite elegir los ensamblajes a analizar, lo que incluye tanto sus propios ensamblajes como los de terceros que utiliza su aplicación (como mscorlib.dll o Log4Net.dll).
  2. En la pestaña “Análisis “, puede cambiar el nombre del proyecto y la carpeta de salida, si es necesario, y también permite configurar algunas opciones de análisis. Puede definir, por ejemplo, las siguientes opciones:
    • con qué resultados de análisis anteriores debe compararse el análisis actual realizado;
    • definir la ubicación en la que se almacenan los resultados de los análisis históricos y la frecuencia de los ahorros;
    • definir la frecuencia del registro de las métricas de tendencia y la ubicación donde se guardan. Estos valores se registran en el momento del análisis;
    • establecer los archivos de cobertura (el NCover, dotCover, OpenCover o VisualStudio XML) de los que se recogerán las estadísticas de cobertura de las pruebas;
    • establecer la opción Source File Rebasing, que se utiliza cuando la compilación del código y el análisis de NDepend se ejecutan en una máquina diferente. Si se especifica, la información se recopilará no sólo de los ensamblajes seleccionados, sino también de los archivos fuente si están disponibles.
  3. En la pestaña “Emisión y deuda ” puede configurar el cálculo de la deuda técnica y los resultados. La deuda técnica es el tiempo de trabajo estimado que puede ser necesario para solucionar el problema. Puede encontrar más detalles sobre esta opción y los ajustes proporcionados en la documentación relacionada de NDepend.
  4. La pestaña “ Informe ” permite en realidad personalizar los informes proporcionados (por ejemplo, activar o desactivar opciones como evitar informes demasiado grandes para la base de código grande, ocultar ensamblajes de terceros, etc.).
  5. La pestaña “Rutas referenciadas” muestra todas las rutas referenciadas por el proyecto NDepend y aquí puede gestionar la redirección de las rutas. También contiene una explicación sobre los tipos de ruta que se pueden utilizar y permite gestionar las variables de ruta.

Después de haber revisado el kit de ajustes disponibles, pasemos a la revisión de las características de NDepend. Haga clic en “Añadir solución o proyecto de VS”, seleccione el proyecto que desea analizar y haga clic en el botón “Ejecutar el análisis en el proyecto actual” (o haga clic en F5). El análisis es bastante rápido (lo probamos en varios proyectos de diferentes tamaños) y después de analizarlo verá un tablero de mando cumplido con los resultados como se muestra a continuación:

En la parte superior, puede encontrar información estructurada sobre los resultados del análisis, como el porcentaje de comentarios, el número de líneas de código, el número de fallos, advertencias, etc. Los gráficos de tendencias, que se muestran en la parte inferior de la captura de pantalla, proporcionan una visión general de los cambios en la calidad de su código a lo largo del tiempo. En un primer momento, puede parecer que no es demasiado informativo, pero más adelante, después de trabajar en la mejora del código, verá el progreso.

Puede hacer clic en los valores de “Reglas”, “Puertas de calidad” y todas las demás casillas para ver más información relacionada. Por ejemplo, hay 1 regla violada en nuestro proyecto de prueba, y si hace clic en el valor, a la derecha se mostrará una breve información sobre los problemas. Si hace clic con el botón derecho del ratón y selecciona “Descripción de la regla en la vista de información”, verá una explicación detallada, como se muestra a continuación:

Estas explicaciones son bastante informativas y contienen tanto la descripción de los problemas como enlaces para ver información más detallada. Haciendo doble clic en la regla, verá dónde se encuentra realmente el problema. Un contador en la parte derecha de los cuadros muestra el número de problemas solucionados (puede encontrarlos en la captura de pantalla de arriba).

Consulta del lenguaje del código

Debajo del “Cuadro de mandos”, se encuentra el “Explorador de consultas y reglas”, que es uno de los paneles importantes para la comprensión y personalización de su análisis. Muestra todas las reglas aplicadas y puede activar o desactivar fácilmente cualquiera de ellas o incluso escribir una nueva, lo que le convenga. Todas las reglas están escritas en lenguaje de consulta de código (CQL), cuya sintaxis es similar a la de LINQ, por lo que no debería haber problemas a la hora de añadir o editar reglas, sobre todo porque el editor cuenta con resaltado de sintaxis, finalización de código y documentación con herramientas

Esta es una característica realmente poderosa y genial de NDepend. A pesar de que proporcionan una gran cantidad de métricas de código por defecto, mucha gente estaría entusiasmada con la posibilidad de añadir sus propias reglas empresariales o personales, que encuentran como un “must-have” para comprobar la calidad. Todos los cambios se guardan en el archivo .ndproj, por lo que si lo comparte, por ejemplo, a través del control de origen, todo el equipo tendrá los nuevos cambios. Al principio, puede llevar un tiempo establecer todas las reglas necesarias, pero después de esto, estará seguro de que el análisis es 100% adecuado para su proyecto.

Todas las reglas predefinidas tienen comentarios que le proporcionan una descripción más completa. Para ver dicha explicación, sólo tiene que hacer clic en la regla que le interese y, en el lado izquierdo, verá su consulta CQL y una descripción.

Gráfico de dependencia

NDepend tiene otra gran funcionalidad: el gráfico de dependencias, que puede ser realmente útil para proyectos grandes cuando se trata de entender la estructura y las dependencias. El tamaño de cada nodo está directamente relacionado con el número de líneas de código que contiene, pero este parámetro se puede cambiar fácilmente en el panel. El gráfico está coloreado, lo que ayuda a separar visualmente los conjuntos de los que depende (en azul) y los conjuntos que dependen de él (en verde). Cada nodo es navegable, por lo que puede abrir su código fuente simplemente haciendo clic en el nodo necesario

Matriz de dependencia

Como puede ver, para un proyecto pequeño el gráfico es bastante comprensible y en miniatura. Para los proyectos grandes la situación es bastante diferente – el gráfico es enorme y bastante confuso e, indiscutiblemente, es difícil mostrar una estructura compleja de un proyecto grande como un pequeño gráfico claro. Para navegar por estructuras grandes, la matriz de dependencia se adapta mejor

La matriz también muestra las dependencias entre los ensamblajes y sus miembros y otros ensamblajes del proyecto. Cada celda no vacía contiene un número, que muestra la fuerza de los vínculos (número de miembros, métodos, campos, tipos o espacios de nombres implicados en el acoplamiento). El color de estas celdas también tiene su significado y puede ayudarle a identificar el código que necesita refactorización

Vista de las métricas del código

La vista de métricas permite visualizar las métricas del código de la aplicación para mejorar la comprensión de la base de código. Esta vista muestra, en función de la configuración seleccionada, todos los métodos, campos, tipos, espacios de nombres o conjuntos representados por un rectángulo de color. Por defecto, el nivel está fijado en “Método”, por lo que todos los métodos agrupados por el ensamblaje se muestran en la vista. El tamaño de cada rectángulo depende del número de líneas de código y el color depende de la complejidad ciclomática métrica. Puede cambiar fácilmente cualquiera de los ajustes de esta vista, incluyendo la coloración, la representación, etc.

Resumen

Resumamos todo lo discutido en el artículo. Utilizar herramientas de análisis de código no significa que la calidad de su código vaya a ser, por arte de magia, perfecta. Es necesario comprobar sistemáticamente la calidad del código para detectar a tiempo los problemas, y los analizadores están pensados para ayudar a ello.

En cuanto a NDepend, hemos tratado de hacer una revisión lo más completa posible sin prejuicios. Obtuvimos la licencia de forma gratuita, sin ninguna presión por parte del equipo de NDepend para escribir el artículo o para proporcionar una opinión positiva. A pesar de ello, después de usarlo durante algún tiempo, decidimos que esta herramienta puede ser realmente útil y merece al menos una breve descripción de sus características. NDepend es una herramienta realmente potente, que proporciona una revisión objetiva e imparcial de su código. La posibilidad de personalizar el análisis para cada proyecto conlleva un enorme potencial. En cualquier caso, la única manera de decidir si es 100% adecuada para usted es probarla usted mismo, sobre todo teniendo en cuenta que tienen una versión de prueba.