El paquete analysis de Go: interfaz para análisis estático modular

Fuentes: The analysis package: a static analysis interface for Go

El paquete analysis del proyecto Go define la interfaz entre un análisis estático modular y el programa que lo ejecuta, conocido como driver. Un análisis estático es una función que examina un paquete de código Go y emite diagnósticos —generalmente errores en el código—, aunque también puede producir resultados adicionales como refactorizaciones sugeridas o hechos útiles sobre el programa. Cuando un análisis detecta errores, se le denomina informalmente "checker"; el checker de printf, por ejemplo, señala fallos en las cadenas de formato de fmt.Printf.

El adjetivo "modular" indica que el análisis inspecciona un paquete cada vez, pero puede guardar información de paquetes de nivel inferior y reutilizarla al examinar paquetes superiores, de forma análoga a la compilación separada en un toolchain. El checker de printf aplica esta idea: cuando descubre que log.Fatalf delega en fmt.Printf, registra el hecho y también valida las llamadas a esa función desde otros paquetes.

Gracias a una interfaz común, los checkers de muy diversos orígenes pueden combinarse y reutilizarse en herramientas de línea de comandos (como vet), editores e IDE, sistemas de compilación y pruebas (go build, Bazel o Buck), frameworks de tests, herramientas de revisión de código, indexadores (SourceGraph), visores de documentación (godoc) o pipelines por lotes sobre grandes bases de código. El tipo central de la API es Analyzer, que describe estáticamente la función de análisis —nombre, documentación, flags, relaciones con otros analizadores y su lógica— y se declara como una variable prácticamente constante. Un driver importa la lista de Analyzer que necesita, normalmente uno por paquete, y los expone al usuario mediante ayuda en línea, interfaces gráficas o archivos de configuración. El tipo Pass, por su parte, describe la unidad mínima de trabajo: la aplicación de un Analyzer concreto a un paquete Go concreto, y ofrece al Run la información del paquete y operaciones para devolver diagnósticos al driver.