
Una herramienta de análisis de código estático para CFML.
Licencia: BSD
Versión actual: 1.5.x
Consulte ChangeLog.md para obtener más información.
CFLINT es un proyecto desarrollado y trabajado por voluntarios. Al registrar problemas, sea amable y considerado. Estamos aquí para ayudar. Realmente apreciamos soluciones y mejoras, así que no dude en hablar con nosotros y/o proporcionar solicitudes de extracción.
/src/main contiene el código fuente. Las pruebas se pueden encontrar en /src/test . Cflint depende en gran medida del proyecto CFParser, así como un montón de bibliotecas de Java de terceros.
La rama maestra se considera nuestra base de código estable. La mayor parte del desarrollo ocurre en la rama de desarrollo resp. Ramas de desarrollo local para problemas específicos.
Bifurca el repositorio en su cuenta y clon o descargue la base de código como un archivo postal.
Instale las herramientas de su elección y se construya a través de Gradle o Maven (en desuso). Cflint requiere Java 8.
a. Gradle: ejecutar
gradlew build
En el directorio CFLINT
b. Maven: ejecutar
mvn clean install
En el directorio CFLINT
Alternativamente, importe la base de código CFLINT en el IDE de su elección y use su integración de Gradle/Maven respectivamente. Esto debería funcionar fuera de la caja para los usuarios de Eclipse e IntelliJ.
Obtenga la última versión de Maven Central o de la página de lanzamiento de Cflint GitHub o cree el proyecto.
Si desea usar CFLINT desde otro proyecto Maven, use:
< dependency >
< groupId >com.github.cflint</ groupId >
< artifactId >CFLint</ artifactId >
< version >1.4.0</ version >
</ dependency >O siempre use lo último:
< dependency >
< groupId >com.github.cflint</ groupId >
< artifactId >CFLint</ artifactId >
< version >LATEST</ version >
</ dependency >Con los binarios recuperados uno u otro lado, ahora puede usar CFLINT en la línea de comando.
CFLint-1.5.0-all.jar
java -jar CFLint-1.5.0-all.jar -folder <baseFolder>
java -jar CFLint-1.5.0-all.jar -file <fullPathToFile>
java -jar CFLint-1.5.0-all.jar -help
Nota: Este es un trabajo en progreso, actualmente estamos recopilando información de una variedad de fuentes.
Las opciones más simples para ejecutar CFLINT son a través de la línea de comando. CFLINT actualmente tiene un modo UI (activado por -UI en la línea de comandos) que será eliminado por lo último para CFLINT 2.0 - consulte el número 316. Si confía en el modo de interfaz de usuario, desafortunadamente está por su cuenta, no se dedicará más trabajo a esto desde aquí en adelante.
Alternativamente, a la línea de comando, puede poner archivos .cflintrc en ciertos directorios. Configuración de cflint de esta manera conceptualmente le permite ejecutar reglas específicas en partes específicas de su aplicación.
CFLINT actualmente admite la configuración basada en JSON y XML. La configuración basada en XML está en desuso en CFLINT 1.3.0 y se eliminará en CFLINT 2.0.
Cuando CFLINT se ejecuta, escanea y analiza su código (usando CFParser). El árbol de sintaxis se está examinando contra un conjunto de reglas integradas.
En cflint, esas reglas se llaman e implementan como complementos (viven en /src/main/java/com/cflint/plugins ). Por defecto, todas las reglas se utilizarán con su base de código. Esto es lo que mucha gente hará, pero el uso de la configuración le permite crear un escenario personalizado para probar su código. Consulte Reglas.MD para obtener más información sobre las reglas y su significado.
CFLINT es obstinado y cada lanzamiento después de 1.3.0 nunca escaneará en directorios, comenzando con a . Para evitar el tiempo de pérdida de los directorios ocultos, como la configuración de compilación, el almacenamiento del módulo/biblioteca o la información de control de versiones.
El archivo de configuración predeterminado y global es /src/main/resources/cflint.definition.json . El uso común de CFLINT generalmente no requiere reemplazar este archivo.
Poner un archivo .cflintrc en un directorio le permite especificar ciertas reglas que deben ejecutarse para este directorio y sus hijos. Además, puede especificar un puñado de otras propiedades.
A continuación se muestra un archivo .cflintrc .
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {
"code" : " FUNCTION_HINT_MISSING "
} ],
"inheritParent" : false ,
"parameters" : { }
} rule le permite agregar un complemento para esta carpeta que no figura en la configuración global. Consulte ruleImpl en cflint.definition.json para ejemplos.
excludes e includes permitirle especificar una variedad de objetos que describan reglas que desea aplicar para este directorio y sus hijos. En el ejemplo anterior, la única regla a la que se verifica será function_hint_missing.
inheritParent configura si las reglas establecidas en la configuración global o principal deben ser heredadas como un conjunto base de reglas.
parameters permiten la configuración de reglas. Consulte Reglas.md para los parámetros de cada regla y sus valores predeterminados. Debe preceder al nombre del parámetro con el nombre de la regla separado por un punto.
Tenga en cuenta: inheritPlugins y output se marcaron en desuso en CFLINT 1.2.0 y se eliminaron en 1.4.0. La herencia de complementos ahora siempre se trata como verdadera ya que el equipo no puede ver un caso de uso en el que debe deshabilitarse. El tipo de salida se puede controlar en otro lugar, como los indicadores de la línea de comandos.
Proporcionamos un esquema con las propiedades desactivadas excluidas.
Vea las recetas para algunos ejemplos de uso de .cflintrc . Los archivos de ejemplo se pueden encontrar navegando por los archivos de prueba del proyecto.
Muy a menudo hay escenarios en los que generalmente desea ejecutar un cierto conjunto de reglas contra su código, pero en casos específicos debe ignorar una violación válida.
Un ejemplo común son las violaciones de CFQueryparam_req que no se pueden solucionar aplicando <cfqueryparam> porque su servidor DB no permite parámetros en ciertas posiciones (por ejemplo, en un escenario SELECT something FROM #application.config.linkedServerName#.DefaultDatabase.dbo.Comment Scenario). Vea el número 282 para más ejemplos.
CFLINT ofrece una configuración basada en la anotación para tratar este y escenarios similares. Las anotaciones se pueden colocar en el nivel de componente o función en un CFC o en línea con código.
<!---
@CFLintIgnore SOMETHINGELSE,MISSING_VAR,ANOTHERTHINGTOIGNORE
--->
Ignorando todas las reglas en la línea actual:
//cflint ignore:line
Ignorando una regla específica (o una lista de reglas separadas por comas) en la línea actual:
//cflint ignore:MISSING_VAR
Multiline ignora la anotación:
/*
@CFLintIgnore SOMETHINGELSE,MISSING_VAR,ANOTHERTHINGTOIGNORE
*/
Dentro de SQL, también puedes usar
<!--- @CFLintIgnore CFQUERYPARAM_REQ --->
ignorar una violación de la regla en la siguiente línea.
La configuración de qué complementos se ejecutan y qué reglas se incluyen se inicia con la configuración global y fluye a través de los parámetros de la línea de comando, las reglas de nivel de carpeta y las anotaciones dentro de la fuente.
-configfile , no fomentamos que esta opción se use en las operaciones diarias de CFLINT)-rulegroups , el comportamiento predeterminado es -rulegroups! Experimental)-includeRule y -excludeRule )La regla de configuración que está más cerca de la regla es la que entra en vigencia.
.cflintrc lo agrega nuevamente, disparará por los archivos de origen en esa parte del árbol de origen.-includeRule "MISSING_VAR,CFQUERYPARAM_REQ" CFLINT admite una variedad de opciones de informes y salida que puede controlar a través de banderas de línea de comandos. Más allá de los formatos de salida específicos de texto, XML, JSON o HTML, también puede ejecutar CFLINT con opciones para salida tranquila, detallada y de depuración.
Si no se especifica ningún formato de salida dirigido en absoluto, CFLINT debe crear un informe HTML en el archivo cflint-result.html .
Puede forzar el comportamiento de salida de CFLINT a STDOUT y STDERR especificando opciones para silencio, detallado y depuración. Si no especifica ninguno de los dos, CFLINT devolverá la información interna básica y la salida de error a Stdout y Stderr.
El modo silencioso ( -quiet <boolean> ) suprime la mayoría de la salida que CFLINT crearía durante la pelusa. Esto puede contener errores y excepciones reales, pero también información como la terminación del análisis de plantillas recursivas o ciertos problemas de configuración. No ejecute el modo tranquilo si es probable que necesite ayuda con los mensajes de error o desee comprender mejor lo que CFLINT está haciendo.
Este es el modo de salida mínimo en el que puede ejecutar CFLINT y la función se inspiró originalmente en el problema #4.
Puede haber mensajes ocasionales de CFParser y ANTLR que se empujan a Stderr en esta etapa, a pesar de que CFLINT se ejecuta en modo tranquilo. Este es un problema conocido y se abordará en el futuro.
El modo detallado ( -verbose <boolean> ) permite la salida de pelusa detallada. Esto contiene información sobre los formatos de salida seleccionados y los archivos de configuración que se encuentran y los procesos durante la pelusa, así como el archivo procesado actualmente, CFLINT está funcionando (muestra solo archivos que realmente están escaneados).
Si desea más información sobre el funcionamiento interno de CFLINT durante la ejecución, el modo detallado es el mínimo en el que debe ejecutar CFLINT.
Modo de depuración ( -debug <boolean> ) habilita la salida de depuración. El modo de depuración implica el modo detallado, pero agrega información adicional, como los tokens de analizador y cada archivo procesado (independientemente de ser compatible con su lista de extensión o la lista predeterminada) en las secuencias de salida.
Es posible encenderse y ejecutar modos silenciosos, detallados y depurar juntos al mismo tiempo. Esto se pretende en parte, ya que es posible que no desee ver la información de error suprimida por el modo tranquilo, pero aún así quiere, consulte cierta información que se muestra en el modo verboso. Sin embargo, tome este comportamiento con un grano de sal: puede haber un escenario extraño en el que la combinación -quiet , -verbose y -debug causa una producción inusual.
La excepción es el modo de depuración. En el modo de depuración, CFLINT siempre ignorará la configuración del usuario para detectar detenidamente y tranquilo y se establecerá verbose en true y quiet a false .
La bandera -html instruye a CFLINT para crear un documento HTML. La sintaxis completa es:
-html -html <outputFileName>
La bandera -xml instruye a CFLINT para crear XML. Hay dos opciones para informes XML.
La primera opción es lo que llamamos CFLINT XML. Es un formato interno que se adhiere a un esquema básico proporcionado aquí. Luego puede usar este formato como es o para hacer un procesamiento adicional de su elección.
La segunda opción es FindBugs XML. El documento XML resultante se adhiere a la versión actual de la definición de esquema XML de BugCollection FindBugs y puede usarse en la mayoría de los productos CI/Build-Server. JetBrains TeamCity 10+ puede importar este formato de la caja.
Tenga en cuenta : Actualmente no es posible producir ambos sabores de informes XML al mismo tiempo. Esta es una limitación conocida. Esta limitación se eliminará como parte de CFLINT 2.0 (ver número 331).
Para crear CFLINT XML, proporcione los siguientes argumentos de línea de comandos:
-xml -xmlstyle cflint -xmlfile <outputFileName>
Ejemplo de cflint xml:
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< issues version = " 1.2.1 " timestamp = " 1500107134 " >
< issue severity = " WARNING " id = " CFQUERYPARAM_REQ " message = " CFQUERYPARAM_REQ " category = " CFLint " abbrev = " CR " >
< location file = " /Users/kai/Documents/Code/paypal.cfc " fileName = " paypal.cfc " function = " doSomething " column = " 0 " line = " 325 " message = " < cfquery > should use < cfqueryparam/ > for variable 'arguments.PaymentType'. " variable = " arguments.PaymentType " >
< Expression > <![CDATA[ <cfquery name="doPayment" datasource="#paymentDatasource#">...some more Details... ]]> </ Expression >
</ location >
</ issue >
< issue severity = " WARNING " id = " CFQUERYPARAM_REQ " message = " CFQUERYPARAM_REQ " category = " CFLint " abbrev = " CR " >
< location file = " /Users/kai/Documents/Code/paypal.cfc " fileName = " paypal.cfc " function = " doSomethingElse " column = " 0 " line = " 432 " message = " < cfquery > should use < cfqueryparam/ > for variable 'arguments.something'. " variable = " arguments.something " >
< Expression > <![CDATA[ <cfquery name="doPayment" datasource="#paymentDatasource#">...some more Details... ]]> </ Expression >
</ location >
</ issue >
...
< counts totalfiles = " 108 " totallines = " 55596 " >
< count code = " CFQUERYPARAM_REQ " count = " 39 " ></ count >
< count severity = " WARNING " count = " 39 " ></ count >
</ counts >
</ issues >Para crear FindBugs XML, proporcione los siguientes argumentos de línea de comandos:
-xml -xmlstyle findbugs -xmlfile <outputFileName>
El formato FindBugs XML se crea actualmente utilizando un documento XSLT, transformando el informe CFLINT en FindBugs XML ( /src/main/resources/findbugs/cflint-to-findbugs.xsl ).
La salida de JSON se puede crear con
-json -jsonfile <outputFileName>
Ejemplo de cflint JSON:
{
"version" : " 1.2.1 " ,
"timestamp" : 1501202128 ,
"issues" : [ {
"severity" : " ERROR " ,
"id" : " MISSING_VAR " ,
"message" : " MISSING_VAR " ,
"category" : " CFLINT " ,
"abbrev" : " MV " ,
"locations" : [ {
"file" : " src/test/resources/com/cflint/tests/Ignores/ignoreCFMLAny2.cfc " ,
"fileName" : " ignoreCFMLAny2.cfc " ,
"function" : " testFunction " ,
"column" : 6 ,
"line" : 14 ,
"message" : " Variable someVar is not declared with a var statement. " ,
"variable" : " someVar " ,
"expression" : " someVar "
} ]
} ],
"counts" : {
"totalFiles" : 7 ,
"totalLines" : 49 ,
"countByCode" : [ {
"code" : " MISSING_VAR " ,
"count" : 1
} ],
"countBySeverity" : [ {
"severity" : " ERROR " ,
"count" : 1
} ]
}
}El esquema JSON está disponible aquí.
La salida de texto sin formato se puede crear con
-text -textfile <outputFileName>
Ejemplo de salida de texto plano:
Issue
Severity:WARNING
Message code:CFQUERYPARAM_REQ
File:/Users/kai/Documents/Code/paypal.cfc
Column:0
Line:79
Message:<cfquery> should use <cfqueryparam/> for variable 'arguments.something'.
Variable:'arguments.something' in function:
Expression:<cfquery name="qry" datasource="#variables.dsn#" cachedwithin="#createTimeSpan(0,0,arguments.cacheInMins,0)#">rn...some Details...
Severity:WARNING
Message code:CFQUERYPARAM_REQ
File:/Users/kai/Documents/Code/paypal.cfc
Column:0
Line:145
Message:<cfquery> should use <cfqueryparam/> for variable 'arguments.something'.
Variable:'arguments.something' in function:
Expression:<cfquery name="qry" datasource="#variables.dsn#" cachedwithin="#createTimeSpan(0,0,arguments.cacheInMins,0)#">rn...some Details...
...
Total files:108
Total lines:55690
Issue counts:1
CFQUERYPARAM_REQ:4
Total issues:4
Total warnings:4
Para interactuar directamente con CFLINT dentro del JVM, use la API CFLINT.
import com . cflint . api . CFLintAPI ;
import com . cflint . api . CFLintResult ;
CFLintAPI api = new CFLintAPI ();
CFLintResult result = api . scan ( filename );
String jsonResult = result . getJSON ();Para Jenkins , mire el complemento Jenkins/Hudson mencionado a continuación.
TeamCity de JetBrains tiene apoyo para los informes de inspección del código XML FindBugs. Se pueden producir fuera de la caja con cflint desde 1.2.0 en adelante (ver arriba en la sección FindBugs XML).
Hay apoyo para Sonarqube a través del complemento Sonar Coldfusion de Stepstone mencionado más adelante.
Para Azure DevOps/TFS , mire la extensión de compilación de tuberías de Azure/TFS mencionada a continuación.
Hay un envoltorio NPM para cflint a continuación. Tenga en cuenta que el envoltorio parece venir con su propio binario CFLINT agrupado que podría no estar actualizado, que está fuera de nuestro control.
Otros productos en la categoría de Integración/Build Server también pueden funcionar. Si está utilizando un producto específico que funcione para usted con CFLINT, háganoslo saber. Si no puede lograr que CFLINT funcione en un entorno que use, háganoslo saber también, podríamos ayudarlo.
Hay varias integraciones IDE para CFLINT que están disponibles. A continuación hay algunas breves descripciones, pero si desea saber más, vea interesantes proyectos de terceros.
Hay soporte IDE para el texto sublime 3 a través de un proyecto de terceros que utiliza sublimelinter.
También hay soporte para Adobe Coldfusion Builder a través de un proyecto de terceros. Usuarios de CFBuilder, también vea la discusión en el número 327.
Los usuarios de Atom pueden integrarse a través de AtomLinter a través de un proyecto de terceros.
Una extensión para el código Visual Studio también está disponible como un proyecto de terceros.
El soporte para IntelliJ de JetBrains está disponible como complemento de terceros.
package com . cflint . plugins . core ;
import net . htmlparser . jericho . Element ;
import cfml . parsing . cfscript . script . CFFuncDeclStatement ;
import cfml . parsing . cfscript . script . CFFunctionParameter ;
import cfml . parsing . cfscript . script . CFScriptStatement ;
import com . cflint . BugList ;
import com . cflint . plugins . CFLintScannerAdapter ;
import com . cflint . plugins . Context ;
import com . cflint . tools . CFTool ;
public class ArgDefChecker extends CFLintScannerAdapter {
@ Override
public void expression ( final CFScriptStatement expression , final Context context , final BugList bugs ) {
if ( expression instanceof CFFuncDeclStatement ) {
final CFFuncDeclStatement function = ( CFFuncDeclStatement ) expression ;
for ( final CFFunctionParameter argument : function . getFormals ()) {
// handler.addArgument(param.getName());
final String name = argument . getName ();
if (! argument . toString (). contains ( "required" ) && ! argument . toString (). contains ( "=" )) {
function . getLine ();
function . getColumn ();
context . addMessage ( "ARG_DEFAULT_MISSING" , name );
}
}
}
}
@ Override
public void element ( final Element element , final Context context , final BugList bugs ) {
if ( element . getName (). equals ( "cfargument" )) {
final String name = element . getAttributeValue ( "name" );
final boolean required = CFTool . toBoolean ( element . getAttributeValue ( "required" ));
final String defaultExpr = element . getAttributeValue ( "default" );
if (! required && defaultExpr == null ) {
element . getSource (). getRow ( element . getBegin ());
element . getSource (). getColumn ( element . getBegin ());
context . addMessage ( "ARG_DEFAULT_MISSING" , name );
}
}
}
} Mirando el element de la función, los argumentos son:
element : la etiqueta CFML actualcontext : el archivo actual que se está marcandobugs : el objeto de violaciones de sujeción La forma más fácil de lograr esto es con un archivo .cflintrc personalizado:
El campo includes se ignora si es una lista vacía, así que simplemente agregue un solo elemento para el cual no coincide nada.
{
"code" : " NOTHING "
}o más simplemente:
{}Lo siguiente ignorará todas las reglas en la carpeta actual y a continuación.
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {} ],
"inheritParent" : false ,
"parameters" : {}
} Esto se puede simplificar utilizando los valores predeterminados de un archivo .cflintrc :
{
"includes" : [{}],
"inheritParent" : false
}Vea la discusión en el número 290 para obtener más información.
Los parámetros dentro de las reglas se pueden anular en los archivos .cflintrc . Use el nombre de la regla y el parámetro unido con un punto.
{
"parameters" : {
"VariableNameChecker.maxLength" : " 15 "
}
} Suministra un archivo cflintexclude.json en la línea de comando con el argumento -filterfile.
Para filtrar los mensajes global_var en la carpeta "Some Package Ubicación", agregue lo siguiente a cflintexclude.json
[
other exclude rules...,
{"file":".*some\\package\\location\\.*","code":"GLOBAL_VAR"}
]
NOTA: Las barras traseras deben escaparse dos veces, una vez para JSON, una vez para expresiones regulares
[
other exclude rules...,
{"file":".*some/package/location/.*","code":"GLOBAL_VAR"}
]
Plantear problemas aquí en Github y los miraremos.
El equipo CFML Slack tiene un canal #cflint al que puede unirse y hablar con la mayoría de los contribuyentes regulares y otros usuarios.
Ver contribuyente.md para más información.
Tenga en cuenta que la mayoría de las bibliotecas y proyectos mencionados aquí no están directamente relacionados y mantenidos por el equipo de CFLINT. Consulte a los autores y mantenedores del proyecto respectivo para obtener soporte utilizando primero sus bibliotecas.
Si ha estado trabajando en (o está pensando en comenzar) un proyecto relacionado con CFLINT, háganoslo saber. Nos complace incluir proyectos de terceros relevantes en la lista anterior.