
Alat analisis kode statis untuk CFML.
Lisensi: BSD
Versi Saat Ini: 1.5.x
Lihat Changelog.md untuk informasi lebih lanjut.
CFLINT adalah proyek yang dikembangkan dan dikerjakan oleh sukarelawan. Saat mencatat masalah, bersikaplah baik dan penuh perhatian. Kami di sini untuk membantu. Kami sangat menghargai perbaikan dan perbaikan, jadi jangan ragu untuk berbicara dengan kami dan/atau memberikan permintaan tarik.
/src/main berisi kode sumber. Tes dapat ditemukan di /src/test . CFLINT sangat bergantung pada proyek CFParser serta sekelompok perpustakaan Java pihak ketiga.
Cabang master dianggap sebagai basis kode stabil kami. Sebagian besar perkembangan terjadi di resp cabang dev. Cabang pengembangan lokal untuk masalah tertentu.
Parahkan repositori ke akun Anda dan klon atau unduh basis kode sebagai file zip.
Pasang perkakas pilihan Anda dan bangun melalui Gradle atau Maven (sudah usang). CFLINT membutuhkan Java 8.
A. Gradle: Eksekusi
gradlew build
di direktori cflint
B. Maven: Eksekusi
mvn clean install
di direktori cflint
Atau, impor basis kode CFLINT ke IDE pilihan Anda dan gunakan integrasi gradle/maven masing -masing. Ini harus bekerja di luar kotak untuk pengguna Eclipse dan IntelliJ.
Dapatkan versi terbaru dari Maven Central atau halaman rilis CFLINT GitHub atau bangun proyek.
Jika Anda ingin menggunakan CFLINT dari dalam proyek Maven lain, gunakan:
< dependency >
< groupId >com.github.cflint</ groupId >
< artifactId >CFLint</ artifactId >
< version >1.4.0</ version >
</ dependency >Atau selalu gunakan yang terbaru:
< dependency >
< groupId >com.github.cflint</ groupId >
< artifactId >CFLint</ artifactId >
< version >LATEST</ version >
</ dependency >Dengan binari yang diambil satu atau cara lain, Anda sekarang dapat menggunakan CFLINT pada baris perintah.
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
Catatan: Ini adalah pekerjaan yang sedang berlangsung, kami saat ini mengumpulkan informasi dari berbagai sumber.
Opsi paling sederhana untuk mengeksekusi CFLINT adalah melalui baris perintah. CFLINT saat ini memiliki mode UI (dipicu oleh -UI pada baris perintah) yang akan dihapus oleh yang terbaru untuk CFLINT 2.0 - lihat Edisi #316. Jika Anda mengandalkan mode UI, sayangnya Anda sendiri - tidak ada lagi pekerjaan yang akan masuk ke sini dari sini dan seterusnya.
Atau ke baris perintah, Anda dapat memasukkan file .cflintrc ke dalam direktori tertentu. Mengkonfigurasi cflint dengan cara ini secara konseptual memungkinkan Anda untuk menjalankan aturan tertentu di bagian tertentu dari aplikasi Anda.
CFLINT saat ini mendukung konfigurasi berbasis JSON- dan XML. Konfigurasi berbasis XML digunakan di CFLINT 1.3.0 dan akan dihapus di CFLINT 2.0.
Ketika CFLINT dieksekusi, ia memindai dan mem -parsing kode Anda (menggunakan CFParser). Pohon sintaks kemudian diperiksa terhadap satu set aturan bawaan.
Di CFLINT, aturan -aturan tersebut dipanggil dan diimplementasikan sebagai plugin (mereka tinggal di /src/main/java/com/cflint/plugins ). Secara default, semua aturan akan digunakan terhadap basis kode Anda. Inilah yang akan dilakukan banyak orang, tetapi menggunakan konfigurasi memungkinkan Anda membangun skenario khusus untuk menguji kode Anda. Lihat aturan.md untuk informasi lebih lanjut tentang aturan dan artinya.
CFLINT memiliki pendapat dan setiap rilis setelah 1.3.0 tidak akan pernah memindai direktori dimulai dengan a . Untuk mencegah pemborosan waktu direktori tersembunyi seperti konfigurasi membangun, penyimpanan modul/perpustakaan atau informasi kontrol versi.
File konfigurasi default dan global adalah /src/main/resources/cflint.definition.json . Penggunaan umum CFLINT biasanya tidak memerlukan penggantian file ini.
Menempatkan file .cflintrc ke dalam direktori memungkinkan Anda untuk menentukan aturan tertentu yang harus dieksekusi untuk direktori ini dan anak -anaknya. Selain itu, Anda dapat menentukan beberapa properti lainnya.
Contoh file .cflintrc ditampilkan di bawah ini:
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {
"code" : " FUNCTION_HINT_MISSING "
} ],
"inheritParent" : false ,
"parameters" : { }
} rule memungkinkan Anda menambahkan plugin untuk folder ini yang tidak tercantum dalam konfigurasi global. Lihat ruleImpl di cflint.definition.json untuk contoh.
excludes dan includes memungkinkan Anda untuk menentukan berbagai objek yang menggambarkan aturan yang ingin Anda terapkan untuk direktori ini dan anak -anaknya. Dalam contoh di atas, satu -satunya aturan yang akan diperiksa adalah function_hint_missing.
inheritParent mengonfigurasi jika aturan yang ditetapkan dalam konfigurasi global atau orang tua apa pun harus diwariskan sebagai serangkaian aturan dasar.
parameters memungkinkan konfigurasi aturan. Lihat aturan.md untuk parameter setiap aturan dan defaultnya. Anda harus mendahului nama parameter dengan nama aturan yang dipisahkan oleh titik.
Harap dicatat: inheritPlugins dan output ditandai sudah usang di CFLINT 1.2.0 dan dihapus dalam 1.4.0. Warisan plugin sekarang selalu diperlakukan sebagai benar karena tim tidak dapat melihat kasus penggunaan di mana ia harus dinonaktifkan. Jenis output dapat dikontrol di tempat lain, seperti bendera baris perintah.
Kami menyediakan skema dengan sifat yang sudah usang dikecualikan.
Lihat resep untuk beberapa contoh penggunaan .cflintrc . Contoh file dapat ditemukan dengan menjelajahi file uji proyek.
Cukup sering ada skenario di mana Anda umumnya ingin menjalankan serangkaian aturan tertentu terhadap kode Anda tetapi dalam kasus tertentu perlu mengabaikan pelanggaran yang valid.
Contoh umum adalah pelanggaran cfqueryparam_req yang tidak dapat diperbaiki dengan menerapkan <cfqueryparam> karena server DB Anda tidak mengizinkan param dalam posisi tertentu (misalnya dalam scenario.dbo.dbo.config.config.linkedServername SELECT something FROM #application.config.linkedServerName#.DefaultDatabase.dbo.Comment ). Lihat masalah #282 untuk lebih banyak contoh.
CFLINT menawarkan konfigurasi berbasis anotasi untuk menangani skenario ini dan serupa. Anotasi dapat ditempatkan pada tingkat komponen atau fungsi dalam CFC atau sejalan dengan kode.
<!---
@CFLintIgnore SOMETHINGELSE,MISSING_VAR,ANOTHERTHINGTOIGNORE
--->
Mengabaikan semua aturan di baris saat ini:
//cflint ignore:line
Mengabaikan aturan tertentu (atau daftar aturan yang dipisahkan koma) pada baris saat ini:
//cflint ignore:MISSING_VAR
Multiline abaikan anotasi:
/*
@CFLintIgnore SOMETHINGELSE,MISSING_VAR,ANOTHERTHINGTOIGNORE
*/
Dalam SQL, Anda juga dapat menggunakan
<!--- @CFLintIgnore CFQUERYPARAM_REQ --->
untuk mengabaikan pelanggaran aturan pada baris berikutnya.
Konfigurasi plugin mana yang dijalankan dan aturan mana yang disertakan dimulai dengan konfigurasi global dan mengalir melalui parameter baris perintah, aturan level folder, dan turun ke anotasi di dalam sumber.
-configfile , kami tidak mendorong opsi ini untuk digunakan dalam operasi CFLINT sehari-hari)-rulegroups , perilaku default adalah - -RuleGroups! Experimental)-includeRule dan -excludeRule )Aturan konfigurasi yang paling dekat dengan aturan adalah yang berlaku.
.cflintrc menambahkannya kembali, itu akan menembakkan file sumber di bagian pohon sumber itu.-includeRule "MISSING_VAR,CFQUERYPARAM_REQ" CFLINT mendukung berbagai opsi pelaporan dan output yang dapat Anda kendalikan melalui bendera baris perintah. Di luar format output yang ditargetkan dari teks, XML, JSON atau HTML Anda juga dapat menjalankan CFLINT dengan opsi untuk output yang tenang, verbose dan debug.
Jika tidak ada format output yang ditargetkan ditentukan sama sekali, CFLINT akan default untuk membuat laporan HTML dalam file cflint-result.html .
Anda dapat memaksa perilaku output CFLINT ke Stdout dan Stderr dengan menentukan opsi untuk tenang, verbose dan debug. Jika Anda tidak menentukan keduanya, CFLINT akan mengembalikan informasi internal dasar dan output kesalahan ke Stdout dan Stderr.
Mode tenang ( -quiet <boolean> ) menekan sebagian besar output CFLINT akan membuat selama berbaris. Ini mungkin mengandung kesalahan dan pengecualian aktual tetapi juga informasi seperti penghentian penguraian template rekursif atau masalah konfigurasi tertentu. Jangan jalankan mode tenang jika Anda kemungkinan akan membutuhkan bantuan dengan pesan kesalahan atau ingin lebih memahami apa yang dilakukan CFLINT.
Ini adalah mode output minimum yang dapat Anda jalankan CFLINT dan fitur awalnya terinspirasi oleh Edisi #4.
Mungkin ada pesan sesekali dari CFParser dan ANTLR didorong ke Stderr pada tahap ini - meskipun CFLINT berjalan dalam mode tenang. Ini adalah masalah yang diketahui dan akan dibahas di masa depan.
Verbose Mode ( -verbose <boolean> ) Mengaktifkan output sering verbose. Ini berisi informasi tentang format output yang dipilih dan file konfigurasi yang ditemukan dan diproses selama linting serta file CFLINT yang diproses saat ini sedang dikerjakan (hanya menunjukkan file yang benar -benar dipindai).
Jika Anda ingin informasi lebih lanjut tentang cara kerja CFLINT selama eksekusi, Mode Verbose adalah minimum yang harus Anda jalankan.
Mode debug ( -debug <boolean> ) memungkinkan output debug. Mode debug menyiratkan mode verbose tetapi menambahkan informasi tambahan seperti token parser dan setiap file yang diproses (terlepas dari didukung oleh daftar ekstensi default Anda atau ke dalam aliran output.
Dimungkinkan untuk menghidupkan dan menjalankan mode yang tenang, verbose dan debug bersama -sama pada saat yang sama. Ini sebagian dimaksudkan karena Anda mungkin tidak ingin melihat informasi kesalahan ditekan oleh mode yang tenang, tetapi masih ingin jadi melihat informasi tertentu yang ditampilkan dalam mode verbose. Mohon ambil perilaku ini dengan sebutir garam -mungkin ada skenario aneh di mana menggabungkan -quiet , -verbose dan -debug menyebabkan output yang tidak biasa.
Pengecualian adalah mode debug. Dalam mode debug, CFLINT akan selalu mengabaikan pengaturan pengguna untuk verbose dan tenang dan mengatur verbose menjadi true dan quiet menjadi false .
Bendera -html menginstruksikan cflint untuk membuat dokumen HTML. Sintaks lengkapnya adalah:
-html -html <outputFileName>
Flag -xml menginstruksikan CFLINT untuk membuat XML. Ada dua opsi untuk pelaporan XML.
Opsi pertama adalah apa yang kami sebut CFLINT XML. Ini adalah format internal yang menganut skema dasar yang disediakan di sini. Anda kemudian dapat menggunakan format ini apa adanya atau untuk melakukan pemrosesan lebih lanjut pilihan Anda.
Opsi kedua adalah FindBugs XML. Dokumen XML yang dihasilkan mematuhi versi saat ini dari definisi skema XML BugCollection FindBugs dan dapat digunakan di sebagian besar produk Ci-/Build-Server. JetBrains TeamCity 10+ dapat mengimpor format ini di luar kotak.
Harap dicatat : Saat ini tidak mungkin untuk menghasilkan kedua rasa Laporan XML secara bersamaan. Ini adalah batasan yang diketahui. Keterbatasan ini akan dihapus sebagai bagian dari CFLINT 2.0 (lihat Edisi #331).
Untuk membuat CFLINT XML, berikan argumen baris perintah berikut:
-xml -xmlstyle cflint -xmlfile <outputFileName>
Contoh 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 >Untuk membuat FindBugs XML memberikan argumen baris perintah berikut:
-xml -xmlstyle findbugs -xmlfile <outputFileName>
Format FindBugs XML saat ini dibuat menggunakan dokumen XSLT, mengubah laporan CFLINT menjadi FindBugs XML ( /src/main/resources/findbugs/cflint-to-findbugs.xsl ).
Output JSON dapat dibuat dengan
-json -jsonfile <outputFileName>
Contoh 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
} ]
}
}Skema JSON tersedia di sini.
Output teks biasa dapat dibuat dengan
-text -textfile <outputFileName>
Contoh output teks biasa:
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
Untuk berinteraksi secara langsung dengan CFLINT dalam JVM Gunakan 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 ();Untuk Jenkins , silakan lihat plugin Jenkins/Hudson yang disebutkan lebih lanjut di bawah ini.
TeamCity JetBrains memiliki dukungan untuk laporan inspeksi kode XML FindBugs. Mereka dapat diproduksi di luar kotak dengan CFLINT dari 1.2.0 dan seterusnya (lihat di atas di bagian Findbugs XML).
Ada dukungan untuk Sonarqube melalui plugin Sonar Coldfusion Sonar Stepstone yang disebutkan lebih lanjut di bawah ini.
Untuk Azure DevOps/TFS , silakan lihat ekstensi Azure Pipeline/TFS Build yang disebutkan lebih lanjut di bawah ini.
Ada pembungkus NPM untuk CFLINT di bawah ini. Perlu diketahui bahwa pembungkusnya tampaknya datang dengan biner CFLINT yang dibundel sendiri yang mungkin tidak terkini, yang berada di luar kendali kami.
Produk lain dalam kategori server Integrasi/Bangun mungkin berfungsi juga. Jika Anda menggunakan produk tertentu yang cocok untuk Anda dengan CFLINT, beri tahu kami. Jika Anda tidak bisa membuat CFLINT bekerja di lingkungan yang Anda gunakan, beri tahu kami juga - kami mungkin dapat membantu.
Ada beberapa integrasi IDE untuk CFLINT yang tersedia. Di bawah ini adalah beberapa deskripsi singkat, tetapi jika Anda ingin tahu lebih banyak, lihat proyek pihak ketiga yang menarik.
Ada dukungan IDE untuk Sublime Text 3 melalui proyek pihak ketiga yang menggunakan sublimelinter.
Ada juga dukungan untuk Adobe Coldfusion Builder melalui proyek pihak ketiga. Pengguna CFBuilder, silakan lihat diskusi dalam edisi #327.
Pengguna Atom dapat berintegrasi melalui Atomlincter melalui proyek pihak ketiga.
Ekstensi untuk kode studio visual juga tersedia sebagai proyek pihak ketiga.
Dukungan untuk JetBrains ' IntelliJ tersedia sebagai plugin pihak ketiga.
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 );
}
}
}
} Melihat element fungsi, argumennya adalah:
element - Tag CFML saat inicontext - file saat ini sedang diperiksabugs - Objek pelanggaran yang ditambahkan Cara termudah untuk mencapai ini adalah dengan file .cflintrc khusus:
Bidang includes diabaikan jika itu adalah daftar kosong, jadi cukup tambahkan satu item ke dalamnya yang tidak cocok.
{
"code" : " NOTHING "
}atau lebih sederhana:
{}Berikut ini akan mengabaikan semua aturan di folder saat ini dan di bawah ini.
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {} ],
"inheritParent" : false ,
"parameters" : {}
} Ini dapat disederhanakan dengan menggunakan nilai default file .cflintrc :
{
"includes" : [{}],
"inheritParent" : false
}Lihat diskusi dalam edisi #290 untuk info lebih lanjut.
Parameter dalam aturan dapat diganti dalam file .cflintrc . Gunakan nama aturan dan parameter bergabung dengan titik.
{
"parameters" : {
"VariableNameChecker.maxLength" : " 15 "
}
} Suplai file cflintexclude.json di baris perintah dengan argumen -filterfile.
Untuk memfilter pesan global_var di folder "beberapa package location", tambahkan yang berikut ke cflintexclude.json
[
other exclude rules...,
{"file":".*some\\package\\location\\.*","code":"GLOBAL_VAR"}
]
CATATAN: Punggung belakang harus diloloskan dua kali, sekali untuk JSON, sekali untuk ekspresi reguler
[
other exclude rules...,
{"file":".*some/package/location/.*","code":"GLOBAL_VAR"}
]
Naikkan masalah di sini di GitHub dan kami akan melihatnya.
Tim CFML Slack memiliki saluran #cflint yang dapat Anda ikuti dan berbicara dengan sebagian besar kontributor reguler dan pengguna lainnya.
Lihat Kontribusi.MD untuk informasi lebih lanjut.
Harap dicatat bahwa sebagian besar perpustakaan dan proyek yang disebutkan di sini tidak terkait langsung dan dikelola oleh tim CFLINT. Silakan lihat penulis dan pengelola proyek masing -masing untuk dukungan menggunakan perpustakaan mereka terlebih dahulu.
Jika Anda telah mengerjakan (atau berpikir untuk memulai) proyek yang terkait dengan CFLINT, beri tahu kami. Kami senang memasukkan proyek pihak ketiga yang relevan ke daftar di atas.