
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相關的項目,請告訴我們。我們很高興將相關的第三方項目包括在上面的列表中。