
CFMLの静的コード分析ツール。
ライセンス:BSD
現在のバージョン:1.5.x
詳細については、changelog.mdを参照してください。
CFLINTは、ボランティアによって開発され、取り組んだプロジェクトです。ロギングの問題をお願いします。親切で思いやりを持ってください。私たちは助けるためにここにいます。修正と改善に本当に感謝しているので、お気軽にお話ししたり、プルリクエストを提供したりしてください。
/src/mainにはソースコードが含まれています。テストは/src/testで見つけることができます。 CFLINTは、CFParserプロジェクトとサードパーティのJavaライブラリの束に大きく依存しています。
マスターブランチは、安定したコードベースと見なされます。開発のほとんどは、Dev Branch Respで行われます。特定の問題のためのローカル開発ブランチ。
リポジトリをアカウントにフォークし、zipファイルとしてコードベースをクローンまたはダウンロードします。
選択したツールをインストールし、GradleまたはMaven(非推奨)でビルドします。 CflintにはJava 8が必要です。
a。 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に住んでいます)。デフォルトでは、すべてのルールがコードベースに対して使用されます。これは多くの人が行うことですが、構成を使用すると、カスタムシナリオを構築してコードに対してテストできます。ルールとその意味の詳細については、rules.mdを参照してください。
Cflintは意見があり、1.3.0以降のすべてのリリースは、aから始まるディレクトリでスキャンすることはありません.ビルド構成、モジュール/ライブラリストレージ、バージョン制御情報などの非表示ディレクトリの時間の無駄を防ぐため。
デフォルトおよびグローバル構成ファイルは/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です。
Globalまたは親構成に設定されたルールがルールのベースセットとして継承される必要があるかどうかをinheritParent構成。
parameters使用すると、ルールの構成が可能になります。各ルールのパラメーターとそのデフォルトについては、rules.mdを参照してください。ルール名がドットで区切られたパラメーター名の前にする必要があります。
注: inheritPluginsとoutput 、CFLINT 1.2.0で非推奨され、1.4.0で削除されました。プラグインの継承は、チームが無効にする必要があるユースケースを見ることができないため、常に真実として扱われます。コマンドラインフラグなど、出力タイプは他の場所で制御できます。
除外された非推奨プロパティを備えたスキーマを提供します。
.cflintrcのいくつかの使用例については、レシピを参照してください。ファイルの例は、プロジェクトテストファイルを閲覧することで見つけることができます。
多くの場合、コードに対して特定の一連のルールを実行したいシナリオがありますが、特定の場合はそれ以外の場合は有効な違反を無視する必要があります。
一般的な例は、DBサーバーが特定のポジションでパラマを許可しないため、 <cfqueryparam>を適用できないCFQueryParam_Reqの違反です(たとえば、 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 、デフォルトの動作は-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 Mode( -quiet <boolean> )は、それ以外の場合は、リント中にCFLINTが作成する出力のほとんどを抑制します。これには、実際のエラーと例外が含まれているだけでなく、再帰テンプレートの解析や特定の構成の問題の終了などの情報も含まれる場合があります。エラーメッセージの支援が必要であるか、CFLINTが行っていることをよりよく理解したい場合は、静かなモードを実行しないでください。
これは、cflintを実行できる最小出力モードであり、この機能はもともと第4号に触発されました。
Cflintは静かなモードで実行されていても、この段階でCfparserとANTLRからの時折のメッセージがStderrに押し込まれている可能性があります。これは既知の問題であり、将来対処されます。
冗長モード( -verbose <boolean> )は、冗長性の出力を有効にします。これには、選択された出力形式と構成ファイルに関する情報が含まれ、糸くず中にプロセスと、現在処理されているファイルCFLINTが機能している(実際にスキャンされたファイルのみを表示)。
実行中にCFLINTの内部仕組みに関する詳細情報が必要な場合は、冗長モードがCFLINTを実行する最小値です。
デバッグモード( -debug <boolean> )がデバッグ出力を有効にします。デバッグモードは冗長モードを意味しますが、パーサートークンやすべての処理されたファイル(またはデフォルトの拡張機能リストによってサポートされていることに関係なく)などの追加情報を出力ストリームに追加します。
スイッチを入れて、静かに冗長なモードとデバッグモードを同時に実行することができます。これは、エラー情報が静かなモードによって抑制されているのを見たくないかもしれないので、部分的に意図されていますが、それでも冗長モードで特定の情報が表示されていることを確認してください。ただし、この動作を一粒の塩で服用してください - -quiet 、 -verboseおよび-debugを組み合わせて異常な出力を引き起こすという奇妙なシナリオがあるかもしれません。
例外はデバッグモードです。デバッグモードでは、CFLINTは常に冗長で静かにユーザー設定を無視し、 verboseにtrueのquietにfalseに設定します。
Flag -html 、CFLINTにHTMLドキュメントを作成するように指示します。完全な構文は次のとおりです。
-html -html <outputFileName>
Flag -xml 、XMLを作成するようにCFLINTに指示します。 XMLレポートには2つのオプションがあります。
最初のオプションは、cflint xmlと呼ばれるものです。これは、ここで提供される基本的なスキーマを順守する内部形式です。その後、この形式を使用して、選択したものをさらに処理することもできます。
2番目のオプションは、FindBugs XMLです。結果のXMLドキュメントは、FindBugs BugCollection XML Schema定義の現在のバージョンに準拠しており、ほとんどの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>
FindBugs XML形式は現在、XSLTドキュメントを使用して作成されており、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のTeamCityには、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を利用したサードパーティプロジェクトを通じて、崇高なテキスト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フィールドは無視されるため、何も一致しないアイテムを1つ追加するだけです。
{
"code" : " NOTHING "
}またはより簡単に:
{}以下は、現在のフォルダー以下のすべてのルールを無視します。
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {} ],
"inheritParent" : false ,
"parameters" : {}
}これは、 .cflintrcファイルのデフォルト値を使用して簡素化できます。
{
"includes" : [{}],
"inheritParent" : false
}詳細については、Issue#290の説明を参照してください。
ルール内のパラメーターは、 .cflintrcファイルでオーバーライドできます。ルール名とドットで結合されたパラメーターを使用します。
{
"parameters" : {
"VariableNameChecker.maxLength" : " 15 "
}
}-filterfile引数でコマンドラインにcflintexclude.jsonファイルを提供します。
「some package location」フォルダーでglobal_varメッセージをフィルタリングするには、 cflintexclude.jsonに次のものを追加します
[
other exclude rules...,
{"file":".*some\\package\\location\\.*","code":"GLOBAL_VAR"}
]
注:バックスラッシュは、JSONで1回、正規表現のために1回、2回逃げる必要があります
[
other exclude rules...,
{"file":".*some/package/location/.*","code":"GLOBAL_VAR"}
]
Githubでここで問題を提起すると、それらを見ていきます。
CFML Slackチームには、 #cflintチャンネルがあり、ほとんどの通常の貢献者や他のユーザーと話をすることができます。
詳細については、converting.mdを参照してください。
ここで説明した図書館とプロジェクトの大部分は、CFLINTチームに直接関係し、維持されていないことに注意してください。最初にライブラリを使用したサポートについては、それぞれのプロジェクトの著者とメンテナーをご覧ください。
CFLINTに関連するプロジェクトに取り組んでいる(または開始することを考えている)場合は、お知らせください。関連するサードパーティプロジェクトを上記のリストに含めて喜んでいます。