Pasar al contenido principal

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

El análisis de código estático es el que se realiza, a diferencia del análisis dinámico, sin ejecutar el código, mediante una serie de métodos de análisis que se pueden ejecutar sobre el código fuente de una aplicación para detectar problemas potenciales. Estos problemas permiten prevenir tanto errores en el funcionamiento del software, a los que se conoce como bugs, como posibles vulnerabilidades que puedan ser explotadas para atacar el sistema.

Este tipo de análisis permite a los equipos de desarrollo tener una capa más de control de calidad que, al estar automatizada, facilita la detección de los problemas más difíciles de identificar mediante otros procedimientos. Como los test unitarios. Estos suelen estar pensados para verificar el funcionamiento de componentes de software en diferentes entornos o cuando se modifica la aplicación. Pero veamos cómo funciona y en qué consiste el análisis de código estático.

 

¿Qué tipo de fallos puede detectar el análisis de código estático?

En primer lugar, tienes que saber que puedes usar este tipo de análisis para identificar determinadas prácticas que son potencialmente peligrosas. Entre ellas, variables que no se validan adecuadamente y pueden dar lugar a desbordamientos de búfer. También construcciones que pueden ocasionar fugas de memoria (memory leaks) porque no se destruyen correctamente los objetos.

Los programadores veteranos suelen tener en cuenta este tipo de fallos. Algunos lenguajes de programación incluso ayudan a prevenirlos. Sin embargo, potencialmente pueden darse en cualquier lugar de la aplicación. Por lo tanto, es casi inevitable que se produzcan en algún momento.

Por otra parte, las herramientas de análisis de código estático son muy útiles para formar programadores noveles. Estos, posiblemente, no han interiorizado todas las buenas prácticas deseables todavía. Por eso, las advertencias de estas herramientas les pueden enseñar cómo deben llevar a cabo algunas tareas.

Con las posibilidades que ofrece el análisis automatizado de código, y lo complicado que resulta validar manualmente aplicaciones con cierta complejidad, llevar a cabo este tipo de análisis es una gran ventaja de cara a obtener un software con el menor número de problemas posible. Esto, además, hace que sea fácil de mantener.

 

Tipos de análisis de código estático

Existen varios tipos de analizadores de código estático. En primer lugar, encontramos el análisis de código estático basado en patrones. Esta aproximación está programada mediante reglas analíticas que permiten detectar casos indeseables. Por ejemplo, supongamos un método que divide un valor entre una variable. El analizador de código estático podrá advertirnos de una posible división por cero, que constituiría un error en tiempo de ejecución, en caso de que dicha variable reciba el valor cero. La recomendación será hacer una comprobación antes de ejecutar la división o capturar la posible excepción para procesar el error.

Por otra parte, el análisis de código estático basado en flujos puede detectar posibles problemas en la ejecución. Supón que, en el método anterior, el valor de la variable se calcula en una sentencia condicional tipo if…else o switch/case. Un analizador de flujo podría detectar casos en los que ninguna de las condiciones se cumple y, por tanto, se puede intentar usar la variable sin inicializar.

También puede tratarse de un bucle que el programador ha supuesto que se ejecutará al menos una vez, pero que puede ser saltado en determinadas condiciones. El resto de la ejecución se producirá sin haber realizado ciertos cálculos, lo que llevará probablemente a errores.

Existen otros tipos de analizadores de código estáticos, que abarcan otras validaciones. Entre ellas, aunque no corrige errores directamente, están las correcciones de estilo. Esto permite que el código se ajuste a un estándar de estilo y, por tanto, que esté unificado. De esta manera es mucho más sencillo de mantener, y más comprensible.

 

Cuándo hacer el análisis

Por sus características, se trata de un tipo de análisis que se puede llevar a cabo en poco tiempo y de forma sistemática. Además, es fácil detectar qué partes del código se han añadido o modificado en cada ocasión, y analizar solo estas.

Por todo ello, es buena idea llevar a cabo esta tarea en dos momentos. El primero se da cuando un desarrollador incorpora nuevo código al proyecto, para asegurarse de que cumple con ciertos requisitos. El segundo, cuando se va a publicar alguna modificación. Esto hace que el análisis de código estático sea muy apropiado en los proyectos que utilizan integración continua y/o entrega continua (CI/CD).

 

Elegir un analizador adecuado para el procedimiento

Hay varios criterios a tener en cuenta a la hora de elegir un analizador de código estático. Entre ellos, el principal es el lenguaje de programación utilizado. No solo porque las herramientas están pensadas, en general, para interpretar un lenguaje específico. Además, cada lenguaje puede ser más propenso a cierto tipo de problemas, y sus soluciones pueden variar.

Por ejemplo, si utilizas un lenguaje fuertemente tipado, los errores de tipos son escasos. El propio lenguaje introduce restricciones que evitan muchos problemas potenciales. Sin embargo, otros lenguajes más laxos en este sentido necesitan un control más exhaustivo: un programador que desarrolla un método que devuelva un objeto de una determinada clase, puede devolver por descuido un valor falso (booleano) cuando el objeto no existe, en vez de un valor nulo.

Este tipo de error puede ser indetectable en los casos previstos en un test unitario. En ocasiones, los compiladores hacen casting de tipos que interpretan de la misma manera los valores false, null y 0. Sin embargo, si el objeto recuperado se utiliza en otro lugar que comprueba, estrictamente, si se trata de un objeto o de un valor nulo, el error en un punto de la aplicación totalmente distinto al que contiene el bug está garantizado.

Por otra parte tenemos el asunto de las soluciones propuestas. Si te encuentras ante un lenguaje que permite especificar el tipo de datos devuelto, aunque sea de forma opcional (por ejemplo, PHP), una buena sugerencia para el programador es que lo haga. Si esto no es una opción, además de corregir el valor devuelto, puede ser útil validar si el objeto recibido es nulo. O si pertenece a la clase esperada.

Esto no quiere decir que no haya analizadores que sirven para múltiples lenguajes. Los hay, y se adaptan a las particularidades de cada uno. Sin embargo, en muchas ocasiones, es necesario elegir un analizador de código estático diferente para cada lenguaje empleado en la aplicación.

Con cualquiera de ellos, tras elegirlo cuidadosamente, podrás llevar a cabo un análisis del código estático. De esta manera evitarás fallos en él que pueden pasar desapercibidos al ojo humano y derivar en problemas para la aplicación cuando creas que ya está lista. Por eso ¡no te olvides nunca de analizar el código estático cuando estés desarrollando cualquier herramienta!

Share this post

Comments (0)