Análisis estático de código en Go

Marcela Bonell
TechWo
Published in
2 min readAug 22, 2018

Una gran práctica en el desarrollo de software que tristemente no es tan aprovechada o conocida es la integración del análisis estático en el código fuente como parte del ciclo de vida de un proyecto. El análisis consiste en evaluar la manera en que el lenguaje es usado para identificar:

  • Malas prácticas del desarrollador en base a las recomendaciones de uso del lenguaje de programación.
  • Errores de seguridad.
  • Código que no es usado o está duplicado.
  • Errores gramaticales en Inglés.
  • Lineas de código muy largas.
  • Bloques de código complejos que se pueden simplificar.
  • Código con mal formato.
  • Entre otros detalles no detectados por el compilador…
Gopher Artwork por Ashley McNamara

Afortunadamente Go incluye linters que podemos usar mientras codificamos, algunos de los linters más populares son go vet, errcheck y golint.

Simple web server en Go

Imaginemos que tenemos que hacer una revisión al código anterior, probamos la implementación y funciona cómo se supone debe de funcionar, aparentemente el código se ve bien y estamos a punto de aprobarlo cuando no deberíamos ya que no es del todo confiable. Qué sucede con las funciones WriteString y ListenAndServe que retornan errores y no son manejados? Cómo saber si el servidor no arranca porque el puerto está ocupado? No siempre durante una revisión de código se pueden detectar los “detalles” del uso del lenguaje.

Go Meta Linter

La cantidad de linters disponibles en Go para verificar estáticamente el código para detectar errores y advertencias es impresionante. Con gometalinter tendrás una simple herramienta que abarca la mayoría de los linters normalizando los resultados en un formato estándar y fácil de configurar:

<archivo>:<linea>:[<columna>]: <mensaje> (<linter>)

Usando gometalinter en el ejemplo del servidor http, el resultado sería:

$ gometalinter ./…
http-server.go:9:16:warning: error return value not checked (io.WriteString(w, “Hello World!”)) (errcheck)
http-server.go:14:21:warning: error return value not checked (http.ListenAndServe(“:8000”, nil)) (errcheck)
http-server.go:9::warning: Errors unhandled.,LOW,HIGH (gosec)
http-server.go:14::warning: Errors unhandled.,LOW,HIGH (gosec)

Es por eso que se recomienda el tener este tipo de herramientas habilitadas como parte del CI/CD de tu proyecto, ya que prevendrá muchos errores en producción. Pero mejor aún si se implementa como parte de la revisión de código donde el pull request debe pasar por los linters y si no detecta ninguna vulnerabilidad, entonces si podrá estar listo para iniciar la revisión con los demás desarrolladores.

Recursos

--

--

Marcela Bonell
TechWo
Editor for

Software engineer passionate about open source and their communities.