
CFML的静态代码分析工具。
许可证:BSD
当前版本:1.5.x
有关更多信息,请参见ChangElog.md。
Cflint是一个由志愿者开发和开发的项目。记录问题时,请友好且体贴。我们在这里为您提供帮助。我们非常感谢修复和改进,因此请随时与我们交谈和/或提供拉力请求。
/src/main包含源代码。可以在/src/test中找到测试。 Cflint在很大程度上依赖CFPARSER项目以及一堆第三方Java库。
主分支被认为是我们稳定的代码库。大部分发展发生在Dev分支的解释中。本地发展分支针对特定问题。
将存储库分配到您的帐户中,然后克隆或将代码库作为Zip-File下载。
安装您选择的工具,并通过gradle或maven(弃用)构建。 Cflint需要Java 8。
一个。 Gradle:执行
gradlew build
在Cflint目录中
b。 Maven:执行
mvn clean install
在Cflint目录中
另外,将CFLINT代码库导入您选择的IDE,并分别使用其Gradle/Maven集成。这应该可以为Eclipse和Intellij用户开箱即用。
从Maven Central或Cflint GitHub发布页面中获取最新版本或构建项目。
如果要在另一个Maven项目中使用CFLINT,请使用:
< dependency >
< groupId >com.github.cflint</ groupId >
< artifactId >CFLint</ artifactId >
< version >1.4.0</ version >
</ dependency >或始终使用最新信息:
< dependency >
< groupId >com.github.cflint</ groupId >
< artifactId >CFLint</ artifactId >
< version >LATEST</ version >
</ dependency >通过一种或另一种方式检索二进制文件,您现在可以在命令行上使用CFLINT。
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
注意:这是一项正在进行的工作,我们目前正在整理各种来源的信息。
执行CFLINT的最简单选项是通过命令行。 CFLINT当前具有UI模式(由-UI在命令行上触发),该模式将由最新的CFLINT 2.0删除,请参见第316页。如果您依靠UI模式,则不幸的是,您自己不再需要工作。
另外,您可以将.cflintrc文件放入某些目录。从概念上讲,以这种方式配置CFLINT使您可以在应用程序的特定部分中运行特定规则。
CFLINT当前支持基于JSON和XML的配置。基于XML的配置在CFLINT 1.3.0中弃用,并将在CFLINT 2.0中删除。
当Cflint执行时,它会扫描和解析您的代码(使用CFPARSER)。然后,根据一组内置规则对语法树进行检查。
在CFLINT中,这些规则被称为插件并实施(它们播放在/src/main/java/com/cflint/plugins中)。默认情况下,所有规则将用于您的代码库。这就是很多人会做的,但是使用配置使您可以构建一个自定义方案来测试您的代码。有关规则及其含义的更多信息,请参见规则。
CFLINT是有用的,1.3.0之后的每个版本将永远不会在目录中扫描.为了防止浪费隐藏目录的时间,例如构建配置,模块/库存储或版本控制信息。
默认和全局配置文件是/src/main/resources/cflint.definition.json 。 CFLINT的常见用法通常不需要替换此文件。
将.cflintrc文件放入目录中,您可以指定该目录及其子女应执行的某些规则。此外,您可以指定少数其他属性。
一个示例.cflintrc文件如下所示:
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {
"code" : " FUNCTION_HINT_MISSING "
} ],
"inheritParent" : false ,
"parameters" : { }
} rule允许您为该文件夹添加一个未在全局配置中列出的插件。有关示例,请参见cflint.definition.json中的ruleImpl 。
excludes并includes允许您指定要为此目录及其子女应用的规则的一系列对象。在上面的示例中,唯一要检查的规则将是function_hint_missing。
inheritParent配置如果全局或任何父构型中设置的规则应作为规则集继承。
parameters允许规则配置。有关每个规则的参数及其默认值,请参见规则。您必须先于参数名称,其规则名称由DOT分开。
请注意:在CFLINT 1.2.0中将inheritPlugins和output标记为弃用,并在1.4.0中删除。现在,插件继承始终被视为真实,因为团队看不到应该禁用其的用例。可以在其他地方控制输出类型,例如命令行标志。
我们提供了一个不弃用的属性的模式。
有关.cflintrc的一些用法,请参见食谱。示例文件可以通过浏览项目测试文件找到。
通常,您通常需要在某些情况下针对代码运行一套一套规则,但是在特定情况下,需要忽略原本有效的违规行为。
一个常见的示例是违反CFQUERPARAM_REQ,无法通过应用<cfqueryparam>来修复,因为您的DB服务器不允许在某些位置上允许参数(例如,在SELECT something FROM #application.config.linkedServerName#.DefaultDatabase.dbo.Comment中,有关更多示例,请参见第282期。
CFLINT提供了基于注释的配置,以处理这种情况和类似情况。可以将注释放在CFC中的组件或功能级别上,也可以将其与代码内联。
<!---
@CFLintIgnore SOMETHINGELSE,MISSING_VAR,ANOTHERTHINGTOIGNORE
--->
忽略当前行上的所有规则:
//cflint ignore:line
忽略当前行上的特定规则(或逗号分隔的规则列表):
//cflint ignore:MISSING_VAR
多行忽略注释:
/*
@CFLintIgnore SOMETHINGELSE,MISSING_VAR,ANOTHERTHINGTOIGNORE
*/
在SQL中,您也可以使用
<!--- @CFLintIgnore CFQUERYPARAM_REQ --->
忽略在下一行上违反规则的行为。
运行哪些插件的配置以及包含哪些规则的配置开始,从全局配置开始,然后流入命令行参数,文件夹级别规则,然后向源中的注释。
-configfile ,我们不鼓励在CFLINT的日常操作中使用此选项)-rulegroups ,默认行为为 - 符号组!实验)-includeRule和-excludeRule )最接近该规则的配置规则是生效的规则。
.cflintrc将其添加回,它将为源树那部分中的源文件发射源文件。-includeRule "MISSING_VAR,CFQUERYPARAM_REQ" Cflint支持您可以通过命令行标志控制的各种报告和输出选项。除了文本,XML,JSON或HTML的目标输出格式之外,您还可以运行CFLINT,其中具有安静,冗长和调试输出的选项。
如果根本没有指定目标输出格式,则CFLINT默认将在文件cflint-result.html中创建HTML报告。
您可以通过指定安静,冗长和调试的选项来强制CFLINT的输出行为到Stdout和Stderr。如果您也没有指定,CFLINT将将基本的内部信息和错误输出返回到Stdout和Stderr。
安静模式( -quiet <boolean> )抑制大多数输出CFLINT在伸长术期间会产生。这可能包含实际错误和例外,但还包括诸如递归模板解析或某些配置问题之类的信息。如果您可能需要在错误消息方面需要帮助,或者想更好地了解CFLINT在做什么,请不要运行安静模式。
这是您可以运行CFLINT的最小输出模式,该功能最初是受第4期的启发。
即使CFLINT以安静的模式运行,也可能偶尔会有CFPARSER和ANTLR将其推入STDERR的消息。这是一个已知的问题,将来将在未来解决。
详细模式( -verbose <boolean> )启用详细的输出。这包含有关正在找到的输出格式和配置文件的信息,并在伸长过程中进行了处理以及当前处理的文件CFLINT正在使用(仅显示实际扫描的文件)。
如果您需要有关执行过程中CFLINT内部工作的更多信息,则详细模式是您应运行CFLINT的最低限度。
调试模式( -debug <boolean> )启用调试输出。调试模式意味着详细的模式,但在输出流中添加了其他信息,例如解析器令牌和每个处理的文件(无论您或默认扩展名列表如何支持)。
可以同时打开并安静,冗长和调试模式。这部分是旨在的,因为您可能不想看到静态模式抑制错误信息,但仍然需要查看某些以冗长模式显示的信息。不过,请用一粒盐来采取这种行为 - 可能会有一个奇怪的情况 - -quiet , -verbose和-debug会导致异常产出。
例外是调试模式。在调试模式下,CFLINT总是会忽略用户设置的详细和安静,并将verbose设置为true and quiet to false 。
标志-html指示CFLINT创建HTML文档。完整的语法是:
-html -html <outputFileName>
标志-xml指示CFLINT创建XML。 XML报告有两个选择。
第一个选项是我们所说的CFLINT XML。这是遵守此处提供的基本模式的内部格式。然后,您可以使用此格式,也可以对您选择进行进一步处理。
第二个选项是FindBugs XML。由此产生的XML文档遵守FindBugs BugCollection XML模式定义的当前版本,可用于大多数CI-/Build-Server产品。 Jetbrains Teamcity 10+可以从开箱即用。
请注意:目前不可能同时生产两种口味的XML报告。这是已知的限制。作为CFLINT 2.0的一部分,将删除此限制(请参阅第331期)。
为了创建CFLINT XML提供以下命令行参数:
-xml -xmlstyle cflint -xmlfile <outputFileName>
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 >为了创建FindBugs XML提供以下命令行参数:
-xml -xmlstyle findbugs -xmlfile <outputFileName>
当前使用XSLT文档创建FindBugs XML格式,将CFLINT报告转换为FindBugs XML( /src/main/resources/findbugs/cflint-to-findbugs.xsl )。
可以使用JSON输出来创建
-json -jsonfile <outputFileName>
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
} ]
}
}JSON模式可在此处使用。
可以使用纯文本输出来创建
-text -textfile <outputFileName>
纯文本输出的示例:
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
要在JVM中直接与CFLINT进行交互,请使用CFLINT API。
import com . cflint . api . CFLintAPI ;
import com . cflint . api . CFLintResult ;
CFLintAPI api = new CFLintAPI ();
CFLintResult result = api . scan ( filename );
String jsonResult = result . getJSON ();对于Jenkins ,请查看下面提到的Jenkins/Hudson插件。
Jetbrains的团队表现支持FindBugs XML代码检查报告。它们可以从1.2.0开始的CFLINT开箱即用(请参见Findbugs XML部分中的上文)。
通过Stepstone的Sonar Coldfusion插件,可以支持Sonarqube 。
对于Azure DevOps/TFS ,请查看下面提到的Azure Pipeline/TFS构建扩展。
下面有一个cflint的NPM包装器。请注意,包装器似乎配备了自己的捆绑的Cflint二进制文件,这可能不是最新的,这是我们无法控制的。
集成/构建服务器类别中的其他产品也可能起作用。如果您正在使用适合您使用CFLINT的特定产品,请告诉我们。如果您无法在使用的环境中使用CFLINT工作,请告诉我们 - 我们也许可以提供帮助。
CFLINT有几种IDE集成。以下是一些简短的描述,但是如果您想了解更多,请参阅有趣的第三方项目。
通过使用Sublimelinter的第三方项目对Sublime Text 3有IDE支持。
通过第三方项目,还可以支持Adobe Coldfusion Builder 。 CFBuilder的用户,也请参见第327期中的讨论。
Atom的用户可以通过第三方项目通过Atomlinter集成。
Visual Studio代码的扩展名也可以作为第三方项目提供。
对JetBrains的Intellij的支持可作为第三方插件提供。
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 );
}
}
}
}查看函数element ,参数是:
element - 当前CFML标签context - 当前文件正在检查bugs - 违规的附加对象实现此目的的最简单方法是使用自定义.cflintrc文件:
如果includes字段是一个空列表,则忽略了该字段,因此只需在其中添加一个项目即可。
{
"code" : " NOTHING "
}或更简单:
{}以下将忽略当前文件夹和下面的所有规则。
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {} ],
"inheritParent" : false ,
"parameters" : {}
}可以使用.cflintrc文件的默认值来简化这一点:
{
"includes" : [{}],
"inheritParent" : false
}有关更多信息,请参见第290期中的讨论。
规则中的参数可以在.cflintrc文件中覆盖。使用规则名称和与点连接的参数。
{
"parameters" : {
"VariableNameChecker.maxLength" : " 15 "
}
}使用-filterFile参数在命令行中提供cflintexclude.json文件。
要在“某些 package location”文件夹中滤除global_var消息,请将以下内容添加到cflintexclude.json
[
other exclude rules...,
{"file":".*some\\package\\location\\.*","code":"GLOBAL_VAR"}
]
注意:后斜线必须逃脱两次
[
other exclude rules...,
{"file":".*some/package/location/.*","code":"GLOBAL_VAR"}
]
在Github上提出问题,我们将研究它们。
CFML Slack团队有一个#cflint频道,您可以加入并与大多数常规贡献者和其他用户交谈。
有关更多信息,请参见贡献。
请注意,此处提到的大多数图书馆和项目与CFLINT团队没有直接关系和维护。请首先使用其图书馆查看相应项目的作者和维护者。
如果您一直在研究(或正在考虑启动)与CFLINT相关的项目,请告诉我们。我们很高兴将相关的第三方项目包括在上面的列表中。