
CFML 용 정적 코드 분석 도구.
라이센스 : BSD
현재 버전 : 1.5.x
자세한 내용은 changelog.md를 참조하십시오.
Cflint는 자원 봉사자들이 개발하고 작업 한 프로젝트입니다. 로깅 문제가 제기되면 친절하고 배려하십시오. 우리는 도와 드리기 위해 왔습니다. 우리는 수정과 개선에 정말 감사하므로 우리와 대화하고/또는 풀 요청을 제공하십시오.
/src/main 에는 소스 코드가 포함되어 있습니다. 테스트는 /src/test 에서 찾을 수 있습니다. CFLINT는 CFPARSER 프로젝트와 타사 Java 라이브러리에 크게 의존합니다.
마스터 브랜치는 안정적인 코드베이스로 간주됩니다. 개발의 대부분은 Dev Branch Resp에서 발생합니다. 특정 문제에 대한 지역 개발 지점.
저장소를 계정으로 포크하고 코드베이스를 zip 파일로 복제하거나 다운로드하십시오.
선택한 툴링을 설치하고 Gradle 또는 Maven (더 이상 사용되지 않음)을 통해 빌드하십시오. Cflint는 Java 8을 필요로합니다.
에이. Gradle : 실행
gradlew build
Cflint 디렉토리에서
비. 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 에 살고 있음). 기본적으로 모든 규칙은 코드베이스에 대해 사용됩니다. 이것은 많은 사람들이 할 일이지만 구성을 사용하면 사용자 정의 시나리오를 구축하여 코드를 테스트 할 수 있습니다. 규칙 및 의미에 대한 자세한 내용은 규칙.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입니다.
inheritParent 글로벌 또는 상위 구성에 설정된 규칙이 기본 규칙 세트로 상속되어야하는 경우 구성됩니다.
parameters 규칙을 구성 할 수 있습니다. 각 규칙의 매개 변수 및 해당 기본값은 규칙.md를 참조하십시오. 규칙 이름이 점으로 분리 된 매개 변수 이름보다 우선해야합니다.
참고 : inheritPlugins 및 output CFLINT 1.2.0에서는 더 이상 사용되지 않고 1.4.0에서 제거되었습니다. 팀이 비활성화 해야하는 사용 사례를 볼 수 없기 때문에 플러그인 상위는 이제 항상 진실로 처리됩니다. 출력 유형은 명령 줄 플래그와 같은 다른 곳에서 제어 할 수 있습니다.
우리는 더 이상 사용되지 않은 속성을 제외한 스키마를 제공합니다.
.cflintrc 의 일부 사용 예는 레시피를 참조하십시오. 예제 파일은 프로젝트 테스트 파일을 탐색하여 찾을 수 있습니다.
일반적으로 코드에 대해 특정 규칙 세트를 실행하려는 시나리오가 종종 있지만 특정 경우 유효한 위반을 무시해야합니다.
일반적인 예는 <cfqueryparam> 적용하여 DB 서버가 특정 위치에서 매개 변수를 허용하지 않기 때문에 <cfqueryparam>을 적용하여 수정할 수없는 CFQueryParam_Req의 위반입니다 (예 : SELECT something FROM #application.config.linkedServerName#.DefaultDatabase.dbo.Comment sinaio). 더 많은 예는 이슈 #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> )는 Linting 동안 Cflint의 대부분을 생성하는 대부분의 출력을 억제합니다. 여기에는 실제 오류 및 예외가 포함될 수 있지만 재귀 템플릿 구문 분석 종료 또는 특정 구성 문제와 같은 정보도 포함됩니다. 오류 메시지에 대한 도움이 필요하거나 Cflint가 수행하는 일을 더 잘 이해하고 싶을 경우 조용 모드를 실행하지 마십시오.
이것은 CFLINT를 실행할 수있는 최소 출력 모드 이며이 기능은 원래 이슈 #4에서 영감을 받았습니다.
CFLINT가 조용한 모드로 실행 되더라도 CFPARSER 및 ANTLR의 메시지 가이 단계에서 Stderr로 가끔씩 추진 될 수 있습니다. 이것은 알려진 문제이며 앞으로 다룰 것입니다.
Verbose Mode ( -verbose <boolean> )는 Verbose Linting 출력을 활성화합니다. 여기에는 선택한 출력 형식 및 구성 파일에 대한 정보가 포함되어 있으며 Linting 중에 프로세스가 포함되어 있으며 현재 처리 된 파일 Cflint가 작동 중입니다 (실제로 스캔 된 파일 만 표시).
실행 중에 CFLINT의 내부 작업에 대한 자세한 정보를 원한다면, Verbose 모드는 CFLINT를 실행 해야하는 최소입니다.
디버그 모드 ( -debug <boolean> ) 디버그 출력을 활성화합니다. 디버그 모드는 Verbose 모드를 암시하지만 Parser 토큰 및 모든 처리 된 파일 (귀하 또는 기본 확장 목록에서 지원되는 것과 상관없이)과 같은 추가 정보를 추가합니다.
동시에 조용하고, 장악 및 디버그 모드를 켜고 실행할 수 있습니다. 이것은 조용한 모드로 오류 정보가 억제되는 것을보고 싶지 않을 수도 있지만 여전히 특정 정보가 장황 모드로 표시되는 것을보고 싶을 것입니다. 이 동작을 소금 한 알로 가져 가십시오. -quiet , -verbose 및 -debug 결합하면 이상한 출력이 발생하는 이상한 시나리오가있을 수 있습니다.
예외는 디버그 모드입니다. 디버그 모드에서 CFLINT는 항상 장황하고 조용한 사용자 설정을 무시하고 verbose true 하고 quiet false 으로 설정합니다.
플래그 -html cflint에게 html 문서를 만들도록 지시합니다. 전체 구문은 다음과 같습니다.
-html -html <outputFileName>
플래그 -xml CFLINT에 XML을 생성하도록 지시합니다. XML보고에는 두 가지 옵션이 있습니다.
첫 번째 옵션은 Cflint XML이라고하는 것입니다. 여기에 제공된 기본 스키마를 준수하는 내부 형식입니다. 그런 다음이 형식을 사용하거나 선택한 추가 처리를 수행 할 수 있습니다.
두 번째 옵션은 FindBugs XML입니다. 결과 XML 문서는 현재 버전의 FindBugs BugCollection XML 스키마 정의에 부착되며 대부분의 Ci-/빌드 서버 제품에서 사용할 수 있습니다. 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 -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 섹션의 위 참조).
아래에 언급 된 Speatstone의 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"}
]
참고 : 뒷면 슬래시는 JSON의 경우 한 번, 정규 표현식의 경우 한 번 두 번 탈출해야합니다.
[
other exclude rules...,
{"file":".*some/package/location/.*","code":"GLOBAL_VAR"}
]
Github에서 문제를 제기하면 우리는 그것들을 볼 것입니다.
CFML Slack 팀에는 대부분의 일반 기여자 및 기타 사용자와 참여하고 대화 할 수있는 #cflint 채널이 있습니다.
자세한 내용은 Contributing.md를 참조하십시오.
여기에 언급 된 도서관과 프로젝트의 대부분은 CFLINT 팀과 직접 관련이 있고 유지 관리되지 않습니다. 먼저 라이브러리를 사용한 지원을 위해 해당 프로젝트의 저자 및 관리자를 참조하십시오.
CFLINT와 관련된 프로젝트를 진행 중이거나 시작한 경우 알려 주시기 바랍니다. 우리는 관련 타사 프로젝트를 위의 목록에 포함 시켜서 기쁩니다.