27 octubre 2009

GeneXus - Análisis estático de código

A todos los programadores!!!
No importa la buena educación en programación tengas, ni que tan experimentado seas, o todo el esfuerzo y buena voluntad que pongas en tu trabajo, está comprobado que en algún momento se termina colando  algún error o bug en el sistema.

El incremento en la complejidad de los sistemas, hace que sea imposible programar libre de errores, somos humanos, por lo tanto existe la posibilidad de que por descuido o error, un defecto termine en la casa del cliente.

Es por ese motivo que cada día se necesita de la ayuda de herramientas que realicen un análisis totalmente automático del código fuente, (a efectos de no permitir fugas de errores ya conocidos).

¿Análisis del código fuente?

El concepto de "análisis de código" es muy amplio, seguramente si le preguntamos a un conjunto de programadores llegaremos a una lista muy larga de posibles definiciones. Al ser un tema tan diverso y confuso, es necesario que se aclare el mismo desde un principio.

Análisis estático de código

Formalmente se denomina "Análisis estático de código" (Static Code Analysis en inglés).
Estático se refiere a que se analiza el software (código) sin que el mismo se encuentre en ejecución.

Existen varios tipos de análisis, algunos de los cuales pueden ser divididos en diferentes categorías dependiendo del valor que cada uno de estos provea.
Intentaré mencionar solamente las categorías más comúnmente utilizadas:
  • Revisión de Código
    Este tipo de herramientas generalmente realizan análisis automatizado mediante la carga y "parseo" del código, en búsqueda de patrones de programación particulares que violen un conjunto de reglas establecidas.

  • Dependencia de código
    Examina la relación entre el código fuente y sus dependencias para crear un mapa de toda la arquitectura de la aplicación.

  • Complejidad de código
    Analizan y comparan la complejidad del código de los programas (métricas) para determinar que parte del sistema es innecesariamente complejo.

  • Tendencias
    Las herramientas de análisis de tendencias, no usan los artefactos de código de forma directa, de lo que se encargan es del estudio de las mejoras o degradaciones en la calidad del código, basándose en los resultados de los análisis de las otras categorías anteriormente mencionados.
    Se intentaría responder la siguiente pregunta: ¿Estamos logrando un mejor código o estamos empeorando la situación?
Beneficios del análisis estático de código.

Algunos beneficios ya fueron mencionados "entre líneas", sin embargo, es mucho más básico como dos razones simples: ahorrar tiempo para ahorrar dinero.

Uno de los aspectos del ahorro de tiempo es muy obvio, se toma mucho menos tiempo en obtener código de mejor calidad frente a la realización de la inspección por método manual.
El detectar los errores de forma temprana permiten a su vez ahorrar tiempo y dinero, pero no solo eso, ahorrarse inconvenientes en etapas en donde dar vuelta atrás y perder tiempo para corregir un problema ya no sería aceptable (y menos cuando el problema sucede en casa del cliente).

Para finalizar, quiero dejar claro que este tipo de herramientas son simplemente una herramienta complementaria que nos ayudan en mejorar la calidad del sistema, por lo tanto no debe de tomarse como sustituto de la revisión realizada de forma manual (y del uso de otras técnicas y herramientas relacionadas a la calidad de nuestro producto).


Recursos

A continuación algunos recursos para aquellos que quieran conocer más del tema (o algunas de sus ramificaciones)

En la Wikipedia:

Static Code Analysis http://en.wikipedia.org/wiki/Static_code_analysis
La categoría http://en.wikipedia.org/wiki/Category:Static_code_analysis

Software Metrics http://en.wikipedia.org/wiki/Software_metric
La categoría http://en.wikipedia.org/wiki/Category:Software_metrics

Automated Code Review http://en.wikipedia.org/wiki/Automated_code_review

Programming Style http://en.wikipedia.org/wiki/Programming_style

Code Refactoring http://en.wikipedia.org/wiki/Code_refactoring

En la comunidad GeneXus:

Métricas y complejidad
GXPoints Counter http://www2.gxtechnical.com/portal/hgxpp001.aspx?15,8,8,O,S,0,,1761s

Descuidos, dependencias y limpieza (cosas en desuso):
KBDoctor http://wiki.gxtechnical.com/commwiki/servlet/hwiki?KBDoctor

Visualización de dependencias:
The GXArchitect http://www2.gxtechnical.com/portal/hgxpp001.aspx?15,27,347,O,S,0,APP;E;1010;0;APP;APA;1010;0;4;APA;MNU;E;90;4;MNU;,

Si conocen alguna herramienta GX relacionada con estos temas y no la tengo en la lista, avisen.

7 comentarios:

P@blo dijo...

David:
Hola. Que tal, soy Pablo y quería decirte que se nos ocurrió reabrir el proyecto GXPoints para continuarlo en la X:
http://wiki.gxtechnical.com/commwiki/servlet/hwiki?GXPoints,
Gracias por tu artículo que es muy ilustrativo.

Eihwaz dijo...

Hola, estoy en un proyecto que me asignaron en la escuela sobre un analizador de código fuente en java, creo que el análisis estático de código me parece una excelente técnica, aunque digan que no funciona, pero quisiera saber si esto se encuentra sólo en aplicaciones como FindBungs, Enerjy o si se puede programar una aplicación similar.

David Giordano dijo...

Hola Eihwaz.
¿porqué piensas que no funciona?
Hoy existen analizadores de código en los compiladores y en las propias máquinas virtuales, por lo que realmente es algo útil. Herramientas como FindBugs y Energy se preocupan más por esas "fallas humanas", el aspecto que al compilador o la máquina virtual no le interesa mucho.
De la misma forma los analizadores pueden usarse para aplicar controles sobre estándares de programación, la tendencia de las herramientas actuales es que las mismas se integren al IDE.
Fíjate que Eclipse o Netbeans (ya que eres del mundo Java) cuando te olvidas de hacer algunas cosas no solo te avisa en cual línea encuentra inconsistencias o te falta hacer algo, sino que incluso te da posibilidades de corrección automática (Fix) o de hacer Refactoring.
En el momento en que puedas entender la estructura de un código fuente, saber si cumple o no contra un estándar o conjunto de reglas puedes hacerte una aplicación. Conozco herramientas "artesanales" con parser básicos que hacen muy bien su trabajo, todo depende de qué nivel de control o análisis quieras implementar.
Puedes encontrar mucho material teórico y práctico asociado a parsers y compiladores, de todas formas si vas a implementar algo "académico" intenta cumplir solo los requerimientos que te plantean, consulta con tu docente por donde encarar el desarrollo y cual es "el tope".

Mucha suerte con tu proyecto!!

Eihwaz dijo...

Otra vez yo. Lo que habia querido decir con que "no funcionan" es porque habia encontrado una pagina web que explicaba tanto ventajas como desventajas de usar el analisis de codigo estatico . De hecho el proyecto del cual mencione, es similar a lo que hacen aplicaciones como findbugs, pmd etc. basandome en alguna estandarizacion de programacion.
Aunque no creo que el analisis de codigo estatico difiera de la fase "front end" de un compilador comun, esa es mi duda si difiere de tal cosa. saludos.

Eihwaz dijo...

Otra vez yo. Lo que habia querido decir con que "no funcionan" es porque habia encontrado una pagina web que explicaba tanto ventajas como desventajas de usar el analisis de codigo estatico . De hecho el proyecto del cual mencione, es similar a lo que hacen aplicaciones como findbugs, pmd etc. basandome en alguna estandarizacion de programacion.
Aunque no creo que el analisis de codigo estatico difiera de la fase "front end" de un compilador comun, esa es mi duda si difiere de tal cosa. saludos.

David Giordano dijo...

Eihwaz, estaría genial que consigas ese link, me interesaría conocer cuales son los argumentos.

Te comento lo que yo pienso... el ser humano tiene límites y solo se dedica a programar, los analizadores de código, pueden implementar controles que un programador natural jamás podría efectuar de forma eficiente, e inclusive los analizadores de código podrían ayudar a detectar determino estilo de programación que permite explotar una vulnerabilidad del compilador.

El programador solo se tiene que enfocar en programar, no en en perder tiempo en controlar algunos aspectos técnicos que son más atados a la tecnología utilizada que a la operativa o necesidad que quiere realmente satisfacer.

Hoy los compiladores tienen incluido análisis y optimización de código, las máquinas virtuales también, inclusive los antivirus y algunos kernels, existe análisis de código en todas partes, sin embargo uno no los ve, y son ellos los que se encargan de hacer la magia posible.

Claro que no existen las balas de plata!! Puedes tener todos los analizadores de código que puedas conseguir y pagar, pero si realmente programas mal o usas incorrectamente la tecnología, el analizador de código no te va a ayudar de mucho.
En el mejor de los casos detectará un patrón extraño y podrá tirarte un warning. ;)

Eihwaz dijo...

Hola que tal, mira te comento, he tratado de buscar el link al cual me refiero sobre las ventajas y desventajas del analisis de codigo estatico, sin embargo no esta, lo habia encontrado en la pagina web de una compañia llamada Coverity (dejo el nombre por si te interesa dar un vistazo), la cual se encarga de desarrollar herramientas de analisis de codigo (tanto dinamico como estatico). De lo poco que saque de informacion sobre desventajas son:
-las herramientas de analisis de codigo comerciales suelen tener un costo bastante alto.
-Exigen un alto conocimiento sobre su manejo, como consecuencia estas herramientas suelen utilizarlas empresas con una gran cultura sobre el desarrollo de software.