
Un outil d'analyse de code statique pour CFML.
Licence: BSD
Version actuelle: 1.5.x
Voir Changelog.md pour plus d'informations.
Cflint est un projet développé et travaillé par des bénévoles. Lorsque les problèmes de journalisation s'il vous plaît, soyez gentil et prévenant. Nous sommes là pour aider. Nous apprécions vraiment les correctifs et les améliorations, alors n'hésitez pas à nous parler et / ou à fournir des demandes de traction.
/src/main contient le code source. Les tests peuvent être trouvés dans /src/test . CFLINT s'appuie fortement sur le projet CFPARSER ainsi qu'un tas de bibliothèques Java tierces.
La branche maître est considérée comme notre base de code stable. La majeure partie du développement se produit dans la branche de développement resp. Branches de développement locales pour des problèmes spécifiques.
Fourk le référentiel dans votre compte et clone ou téléchargez la base de code sous forme de fichier zip.
Installez l'outillage de votre choix et construisez via Gradle ou Maven (déprécié). Cflint nécessite Java 8.
un. Gradle: exécuter
gradlew build
Dans le répertoire Cflint
né Maven: exécuter
mvn clean install
Dans le répertoire Cflint
Alternativement, importez la base de code CFLINT dans l'IDE de votre choix et utilisez respectivement son intégration Gradle / Maven. Cela devrait fonctionner hors de la boîte pour les utilisateurs d'Eclipse et IntelliJ.
Obtenez la dernière version de Maven Central ou de la page de version Cflint GitHub ou créez le projet.
Si vous souhaitez utiliser Cflint à partir d'un autre projet Maven, utilisez:
< dependency >
< groupId >com.github.cflint</ groupId >
< artifactId >CFLint</ artifactId >
< version >1.4.0</ version >
</ dependency >Ou utilisez toujours les derniers:
< dependency >
< groupId >com.github.cflint</ groupId >
< artifactId >CFLint</ artifactId >
< version >LATEST</ version >
</ dependency >Avec les binaires récupérés ou dans l'autre sens, vous pouvez désormais utiliser Cflint sur la ligne de commande.
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
Remarque: Ceci est un travail en cours, nous collectons actuellement des informations provenant de diverses sources.
Les options les plus simples pour exécuter CFLINT se font via la ligne de commande. Cflint a actuellement un mode d'interface utilisateur (déclenché par -ui sur la ligne de commande) qui sera supprimé par le dernier pour Cflint 2.0 - voir le numéro 316. Si vous comptez sur le mode d'interface utilisateur, vous êtes malheureusement par vous-même - plus de travail va dans cela à partir d'ici.
Alternativement à la ligne de commande, vous pouvez mettre des fichiers .cflintrc dans certains répertoires. La configuration de Cflint de cette façon vous permet conceptuellement d'exécuter des règles spécifiques dans des parties spécifiques de votre application.
Cflint prend actuellement en charge la configuration basée sur JSON et XML. La configuration basée sur XML est obsolète dans CFLINT 1.3.0 et sera supprimée dans CFLINT 2.0.
Lorsque Cflint s'exécute, il analyse et analyse votre code (en utilisant cfParser). L'arbre de syntaxe est ensuite examiné par rapport à un ensemble de règles intégrées.
Dans CFLINT, ces règles sont appelées et implémentées sous forme de plugins (ils vivent dans /src/main/java/com/cflint/plugins ). Par défaut, toutes les règles seront utilisées par rapport à votre base de code. C'est ce que beaucoup de gens feront, mais l'utilisation de la configuration vous permet de créer un scénario personnalisé pour tester votre code. Voir les règles.md pour plus d'informations sur les règles et leur signification.
Cflint est opiniâtre et chaque version après 1.3.0 ne scannera jamais dans les répertoires à commencer par a . Pour éviter de perdre du temps de répertoires cachés tels que la configuration de construction, le stockage du module / bibliothèque ou des informations de contrôle de version.
Le fichier de configuration par défaut et global est /src/main/resources/cflint.definition.json . L'utilisation commune de CFLINT ne nécessite généralement pas de remplacement de ce fichier.
Mettre un fichier .cflintrc dans un répertoire vous permet de spécifier certaines règles qui doivent être exécutées pour ce répertoire et ses enfants. De plus, vous pouvez spécifier une poignée d'autres propriétés.
Un exemple de fichier .cflintrc est illustré ci-dessous:
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {
"code" : " FUNCTION_HINT_MISSING "
} ],
"inheritParent" : false ,
"parameters" : { }
} rule vous permet d'ajouter un plugin pour ce dossier qui n'est pas répertorié dans la configuration globale. Voir ruleImpl dans cflint.definition.json pour les exemples.
excludes et includes vous permettre de spécifier un tableau d'objets décrivant les règles que vous souhaitez appliquer pour ce répertoire et ses enfants. Dans l'exemple ci-dessus, la seule règle à vérifier sera function_hint_missing.
inheritParent se configure si les règles définies dans la configuration globale ou n'importe quelle configuration parent doivent être héritées en tant que ensemble de règles de base.
parameters permettent la configuration des règles. Voir règles.md pour les paramètres de chaque règle et leurs valeurs par défaut. Vous devez précéder le nom du paramètre avec le nom de règle séparé par un point.
Veuillez noter: inheritPlugins et output ont été marqués dépréciés dans CFLINT 1.2.0 et supprimés dans 1.4.0. L'héritage du plugin est désormais toujours traité comme vrai car l'équipe ne peut pas voir un cas d'utilisation dans lequel il doit être désactivé. Le type de sortie peut être contrôlé ailleurs, tels que les drapeaux de ligne de commande.
Nous fournissons un schéma avec les propriétés obsolètes exclues.
Voir les recettes pour certains exemples d'utilisation de .cflintrc . Des exemples de fichiers peuvent être trouvés en parcourant les fichiers de test de projet.
Très souvent, il existe des scénarios dans lesquels vous voudriez généralement exécuter un certain ensemble de règles par rapport à votre code, mais dans des cas spécifiques, vous devez ignorer une violation autrement valide.
Un exemple courant est les violations de CFQueryParam_Req qui ne peuvent pas être corrigées en appliquant <cfqueryparam> car votre serveur DB n'autorise pas les paramètres dans certaines positions (par exemple dans un scénario SELECT something FROM #application.config.linkedServerName#.DefaultDatabase.dbo.Comment ). Voir le numéro n ° 282 pour plus d'exemples.
Cflint propose une configuration basée sur l'annotation pour gérer ce scénarios et similaires. Les annotations peuvent être placées sur le niveau du composant ou de la fonction dans un CFC ou en ligne avec le code.
<!---
@CFLintIgnore SOMETHINGELSE,MISSING_VAR,ANOTHERTHINGTOIGNORE
--->
Ignorer toutes les règles sur la ligne actuelle:
//cflint ignore:line
Ignorer une règle spécifique (ou une liste de règles séparée par des virgules) sur la ligne actuelle:
//cflint ignore:MISSING_VAR
Multiline ignore l'annotation:
/*
@CFLintIgnore SOMETHINGELSE,MISSING_VAR,ANOTHERTHINGTOIGNORE
*/
Dans SQL, vous pouvez également utiliser
<!--- @CFLintIgnore CFQUERYPARAM_REQ --->
pour ignorer une violation des règles sur la ligne suivante.
La configuration de quels plugins est exécuté et quelles règles sont incluses commence par la configuration globale et traverse les paramètres de ligne de commande, les règles de niveau de dossier et jusqu'à les annotations dans la source.
-configfile , nous n'encourageons pas cette option à être utilisée dans les opérations quotidiennes de Cflint)-rulegroups , le comportement par défaut est - RuleGroups! Expérimental)-includeRule et -excludeRule )La règle de configuration qui est la plus proche de la règle est celle qui prend effet.
.cflintrc l'ajoute, il tirera des fichiers source dans cette partie de l'arborescence source.-includeRule "MISSING_VAR,CFQUERYPARAM_REQ" CFLINT prend en charge une variété d'options de rapports et de sortie que vous pouvez contrôler via des drapeaux de ligne de commande. Au-delà des formats de sortie ciblés de texte, XML, JSON ou HTML, vous pouvez également exécuter CFLINT avec des options pour la sortie silencieuse, verbeux et de débogage.
Si aucun format de sortie ciblé n'est spécifié, Cflint sera par défaut pour créer un rapport HTML dans le fichier cflint-result.html .
Vous pouvez forcer le comportement de sortie de CFLINT à STDOUT et STDERR en spécifiant des options pour le silence, la verbose et le débogage. Si vous ne spécifiez pas non plus, CFLINT renverra la sortie de base des informations internes et des erreurs à STDOUT et STDERR.
Le mode silencieux ( -quiet <boolean> ) supprime la majeure partie de la sortie que Cflint créerait autrement pendant la liaison. Cela peut contenir des erreurs et des exceptions réelles, mais également des informations comme la terminaison de l'analyse de modèle récursive ou certains problèmes de configuration. N'exécutez pas le mode silencieux si vous aurez probablement besoin d'aide avec des messages d'erreur ou si vous souhaitez mieux comprendre ce que fait CFLINT.
Il s'agit du mode de sortie minimum dans lequel vous pouvez exécuter CFLINT et la fonction a été initialement inspirée par le numéro 4.
Il peut y avoir des messages occasionnels de CFParser et Antlr poussé dans STDERR à ce stade - même si Cflint fonctionne en mode calme. Il s'agit d'un problème connu et sera abordé à l'avenir.
Le mode verbeux ( -verbose <boolean> ) permet la sortie de liaison verbeuse. Cela contient des informations sur les formats de sortie sélectionnés et les fichiers de configuration trouvés et les processus pendant la liaison ainsi que le fichier actuellement traité sur lequel Cflint fonctionne (affichant uniquement les fichiers qui sont réellement analysés).
Si vous souhaitez plus d'informations sur le fonctionnement interne de CFLINT pendant l'exécution, le mode verbeux est le minimum dans lequel vous devez exécuter Cflint.
Le mode de débogage ( -debug <boolean> ) permet la sortie de débogage. Le mode de débogage implique le mode verbeux mais ajoute des informations supplémentaires telles que les jetons d'analyseur et chaque fichier traité (indépendamment d'être pris en charge par votre liste d'extension ou la liste par défaut) dans les flux de sortie.
Il est possible d'allumer et d'exécuter des modes silencieux, verbeux et déboguez ensemble en même temps. Ceci est en partie prévu car vous ne voudrez peut-être pas voir les informations d'erreur supprimées par le mode silencieux, mais vous souhaitez toujours voir certaines informations affichées en mode verbeux. Veuillez cependant prendre ce comportement avec un grain de sel - il pourrait y avoir le scénario impair dans lequel la combinaison -quiet , -verbose et -debug provoque une sortie inhabituelle.
L'exception est le mode de débogage. En mode de débogage, CFLINT ignorera toujours les paramètres utilisateur pour Verbose et silencieux et définira verbose sur true and quiet to false .
Le Flag -html demande à Cflint de créer un document HTML. La syntaxe complète est:
-html -html <outputFileName>
Le Flag -xml demande à Cflint de créer du XML. Il existe deux options pour les rapports XML.
La première option est ce que nous appelons Cflint XML. C'est un format interne qui adhère à un schéma de base fourni ici. Vous pouvez ensuite utiliser ce format tel quel ou pour effectuer un traitement ultérieur de votre choix.
La deuxième option est FindBugs XML. Le document XML résultant adhère à la version actuelle de la définition de schéma XML BugCollection FindBugs et peut être utilisé dans la plupart des produits Ci- / Build-Server. JetBrains TeamCity 10+ peut importer ce format hors de la boîte.
Veuillez noter : Actuellement, il n'est pas possible de produire les deux saveurs de rapports XML en même temps. C'est une limitation connue. Cette limitation sera supprimée dans le cadre de CFLINT 2.0 (voir le numéro # 331).
Pour créer Cflint XML, fournissez les arguments de ligne de commande suivants:
-xml -xmlstyle cflint -xmlfile <outputFileName>
Exemple 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 >Pour créer FindBugs XML, fournissez les arguments de ligne de commande suivants:
-xml -xmlstyle findbugs -xmlfile <outputFileName>
Le format XML FindBugs est actuellement créé à l'aide d'un document XSLT, transformant le rapport Cflint à FindBugs XML ( /src/main/resources/findbugs/cflint-to-findbugs.xsl ).
La sortie JSON peut être créée avec
-json -jsonfile <outputFileName>
Exemple 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
} ]
}
}Le schéma JSON est disponible ici.
La sortie de texte brut peut être créée avec
-text -textfile <outputFileName>
Exemple de sortie de texte brut:
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
Pour interagir directement avec Cflint dans le JVM, utilisez l'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 ();Pour Jenkins , veuillez consulter le plugin Jenkins / Hudson mentionné plus loin ci-dessous.
TeamCity de JetBrains prend en charge les rapports d'inspection de code XML FindBugs. Ils peuvent être produits hors de la boîte avec CFLINT à partir de 1.2.0 (voir ci-dessus dans la section XML Findbugs).
Il y a un soutien à Sonarqube via le plugin de SEPTONE Coldfusion de Stepstone mentionné plus loin ci-dessous.
Pour Azure DevOps / TFS , veuillez consulter l'extension de construction Azure Pipeline / TFS mentionnée ci-dessous.
Il y a un wrapper NPM pour Cflint ci-dessous. Sachez que l'emballage semble venir avec son propre binaire Cflint groupé qui pourrait ne pas être à jour, qui est hors de notre contrôle.
D'autres produits de la catégorie des serveurs d'intégration / build peuvent également fonctionner. Si vous utilisez un produit spécifique qui fonctionne pour vous avec CFLINT, veuillez nous le faire savoir. Si vous ne pouvez pas faire fonctionner CFLINT dans un environnement que vous utilisez, veuillez nous en informer également - nous pourrions être en mesure d'aider.
Il existe plusieurs intégrations IDE pour CFLINT qui sont disponibles. Voici quelques brèves descriptions, mais si vous souhaitez en savoir plus, consultez des projets tiers intéressants.
Il y a une prise en charge IDE pour SUBLIME Text 3 à travers un projet tiers en utilisant Sublimelinter.
Il y a également un support pour Adobe Coldfusion Builder via un projet tiers. Utilisateurs de CFBuilder, veuillez également voir la discussion dans le numéro 327.
Les utilisateurs d' ATOM peuvent s'intégrer via AtomLinter via un projet tiers.
Une extension du code Visual Studio est également disponible en tant que projet tiers.
Prise en charge de l'Intellij de JetBrains est disponible en tant que plugin tiers.
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 );
}
}
}
} En regardant l' element de fonction, les arguments sont:
element - la balise CFML actuellecontext - Le fichier actuel est vérifiébugs - l'objet de violations La façon la plus simple d'y parvenir est avec un fichier .cflintrc personnalisé:
Le champ includes est ignoré s'il s'agit d'une liste vide, alors ajoutez-y un seul élément pour lequel rien correspond.
{
"code" : " NOTHING "
}ou plus simplement:
{}Ce qui suit ignorera toutes les règles dans le dossier actuel et ci-dessous.
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {} ],
"inheritParent" : false ,
"parameters" : {}
} Cela peut être simplifié en utilisant les valeurs par défaut d'un fichier .cflintrc :
{
"includes" : [{}],
"inheritParent" : false
}Voir la discussion dans le numéro 290 pour plus d'informations.
Les paramètres dans les règles peuvent être remplacés dans les fichiers .cflintrc . Utilisez le nom de la règle et le paramètre joint à un point.
{
"parameters" : {
"VariableNameChecker.maxLength" : " 15 "
}
} Fournir un fichier cflintexclude.json dans la ligne de commande avec l'argument -FilterFile.
Pour filtrer les messages global_var dans le dossier "Some Package Location", ajoutez ce qui suit à cflintexclude.json
[
other exclude rules...,
{"file":".*some\\package\\location\\.*","code":"GLOBAL_VAR"}
]
Remarque: les barres obliques doivent être échappées deux fois, une fois pour JSON, une fois pour les expressions régulières
[
other exclude rules...,
{"file":".*some/package/location/.*","code":"GLOBAL_VAR"}
]
Soulevez des problèmes ici sur Github et nous les examinerons.
L'équipe CFML Slack a une chaîne #cflint que vous pouvez rejoindre et parler à la plupart des contributeurs réguliers et des autres utilisateurs.
Voir contribution.md pour plus d'informations.
Veuillez noter que la majorité des bibliothèques et des projets mentionnés ici ne sont pas directement liés et entretenus par l'équipe CFLINT. Veuillez consulter les auteurs et les responsables du projet respectif pour le soutien en utilisant d'abord leurs bibliothèques.
Si vous avez travaillé (ou envisagez de démarrer) un projet lié à CFLINT, veuillez nous le faire savoir. Nous sommes heureux d'inclure des projets tiers pertinents dans la liste ci-dessus.