? argumento
Linter para GO que verifica argumentos de llamadas estáticas contra los guardias de funciones (también conocido como contratos).
Ejemplo
Digamos que tiene la siguiente función:
func div ( n , d float64 ) float64 {
if d == 0 {
panic ( "denominator must not be zero" )
}
return n / d
} Y luego lo llamas así:
Incluso si no conocemos userInput , podemos ver que esta llamada de función entrará en pánico en tiempo de ejecución porque el segundo argumento siempre es cero.
El Linter encuentra e informa tales lugares utilizando la ejecución de código parcial seguro y la magia negra.
? Instalación
go install github.com/orsinium-labs/arguard@latest
Uso
Banderas disponibles:
-
-contracts.follow-imports : configure este indicador en falso para no extraer contratos de los módulos importados. En otras palabras, las violaciones del contrato (Guard) se informarán solo si la función con el contrato y la llamada de función se encuentran en el mismo paquete analizado. Útil para un mejor rendimiento . -
-contracts.report-contracts . Útil para la depuración para ver si el enlace detectó un contrato o no. -
-arguard.report-errors : configure esta bandera para mostrar fallas durante la ejecución del contrato. Por defecto, si Arguard no ejecuta un contrato, simplemente sigue sin informar nada. Útil para la depuración para ver por qué no se informó un error de contrato.
? QNA
- ? ¿Cómo funciona? Hay dos analizadores adentro. El primero detecta contratos de ejecución segura (guardias) en el código. El segundo detecta llamadas a funciones con contratos conocidos, extrae argumentos conocidos estáticamente y ejecuta contratos que pueden ejecutarse usando Yaegi.
- ? ¿Qué es un guardia (contrato)? Una condición IF al comienzo de la función (solo otros contratos pueden ir antes) con una verificación segura de ejecución y el cuerpo solo devuelve un error o
panic de llamadas. - ? ¿Qué tan confiables son los resultados? Si informa un error, es muy probable que haya un error. Si no informa un error, todavía podría haber un error. Es un enlace, no un verificador formal.
- ⚖️ ¿Qué tan estable es el proyecto? El análisis estático en GO puede ser desordenado, especialmente cuando también hacemos la ejecución del código parcial. El enlace puede fallar, estar equivocado o no ser tan inteligente como sea posible. Aún así, es un analizador estático, no una dependencia de la producción, por lo que debería ser seguro usarlo en cualquier proyecto en cualquier entorno. Sin embargo, tenga en cuenta que todavía hay una ejecución de código parcial, por lo que probablemente no debería ejecutarlo en código no confiable, solo para estar seguro.
- ? ¿Habría cambios de ruptura? El proyecto sigue a Semver. Sin embargo, cada lanzamiento, incluso un parche uno, puede comenzar a informar nuevas violaciones en su código. Entonces, en cierto sentido, cada liberación puede estar rompiendo.
- ? ¿Hay una integración de Golangci-Lint? Todavía no, pero eventualmente lo será. Es fácil integrar cualquier linter con análisis con Golangci-Lint, y Arguard está alimentado por análisis. Manténganse al tanto.
- ✏️ ¿Hay una integración IDE? Aún no. Cuando tenemos integración de Golangci-Lint, las integraciones IDE vendrán de forma gratuita.
- ? ¿Es esta una nueva idea? El proyecto implementa una de las cosas que trata, mi biblioteca de Python para el diseño por contrato puede hacer. El acuerdo en sí se basa en la sabiduría de las generaciones, ver esta línea de tiempo.
- ¿Hay una API GO para que pueda usarlo como biblioteca? Sí. El paquete de análisis proporciona una forma nativa de componer analizadores, y así es como puede usar el proyecto. Consulte Main.go para obtener un ejemplo de cómo crear y componer
analysis.Analyzer múltiples. Analyzer Instancias. - ? ? ️ ¿Se mantiene activamente? El proyecto, en las mejores tradiciones de Unix-Way, tiene un alcance muy pequeño y claramente definido. Podría volver a eso de vez en cuando y traer nuevas ideas interesantes que tuve durante las noches de insomnio, pero no hay nada que mantener a diario. Si funciona hoy, no se romperá mañana, gracias a la breve lista de dependencias y la promesa de compatibilidad GO 1.
- ? ¿Qué pasa si encontré un error? Bifurca el proyecto, solucione el error, escriba algunas pruebas y abra una solicitud de extracción. Por lo general, fusión y lento cualquier contribución en un día.