
Статический инструмент анализа кода для CFML.
Лицензия: BSD
Текущая версия: 1.5.x
См. ChangeLog.md для получения дополнительной информации.
Cflint - это проект, разработанный и работающий волонтерами. Пожалуйста, будьте хорошими и внимательными. Мы здесь, чтобы помочь. Мы действительно ценим исправления и улучшения, поэтому не стесняйтесь разговаривать с нами и/или предоставлять запросы на привлечение.
/src/main содержит исходный код. Тесты можно найти в /src/test . Cflint в значительной степени полагается на проект CFPARSER, а также на кучу сторонних библиотек Java.
Главная филиал считается нашей стабильной кодовой базой. Большая часть развития происходит в Dev Branch Sprop. Местные филиалы развития для конкретных вопросов.
Разбейте репозиторий в свою учетную запись и клонируйте или загрузите кодовую базу в виде почтового файла.
Установите инструмент по вашему выбору и постройте через Gradle или Maven (устаревший). Cflint требует Java 8.
а Градл: выполнить
gradlew build
в каталоге CFLINT
беременный Maven: выполнить
mvn clean install
в каталоге CFLINT
В качестве альтернативы импортируйте кодовую базу CFLINT в IDE по вашему выбору и используйте его соответственно интеграцию Gradle/Maven. Это должно работать из коробки для пользователей Eclipse и Intellij.
Получите последнюю версию от Maven Central или на странице выпуска Cflint Github или создайте проект.
Если вы хотите использовать Cflint из другого проекта Maven, используйте:
< 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 в командной строке), который будет удален по последним для CFLINT 2.0 - см. Выпуск № 316. Если вы полагаетесь на режим пользовательского интерфейса, вы, к сожалению, сами по себе - больше не будет работать в этом с этого момента.
В качестве альтернативы в командной строке вы можете поместить файлы .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 никогда не сканирует в каталогах, начиная с . Чтобы предотвратить время тратить время скрытых каталогов, таких как конфигурация сборки, информация о модуле/библиотеке хранения или управления версиями.
Файл по умолчанию и глобальной конфигурации IS /src/main/resources/cflint.definition.json . Общее использование CFLINT обычно не требует замены этого файла.
Вставка файла .cflintrc в каталог позволяет указать определенные правила, которые должны быть выполнены для этого каталога и его детей. Кроме того, вы можете указать несколько других свойств.
Пример файла .cflintrc показан ниже:
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {
"code" : " FUNCTION_HINT_MISSING "
} ],
"inheritParent" : false ,
"parameters" : { }
} rule позволяет добавить плагин для этой папки, которая не указана в глобальной конфигурации. См. ruleImpl в cflint.definition.json для примеров.
excludes и includes , чтобы вы могли указать множество объектов, описывающих правила, которые вы хотите применять для этого каталога и его детей. В приведенном выше примере единственным правилом, которое будет проверено, будет function_hint_missing.
inheritParent настраивает, должны ли правила, установленные в глобальной или любой родительской конфигурации, должны быть унаследованы в качестве базового набора правил.
parameters позволяют конфигурации правил. См. Правила.md для параметров каждого правила и их значения по умолчанию. Вы должны предшествовать имени параметра с помощью имени правила, разделенного точкой.
Обратите внимание: inheritPlugins и output были отмечены в CFLINT 1.2.0 и удалены в 1.4.0. Унижение плагина теперь всегда рассматривается как истинное, поскольку команда не видит использования, в котором он должен быть отключен. Выходной тип можно управлять в другом месте, например, флаги командной строки.
Мы предоставляем схему с исключенными устаревшими свойствами.
См. Рецепты для некоторых примеров использования .cflintrc . Примеры файлов можно найти, просмотрев файлы тестирования проекта.
Довольно часто существуют сценарии, в которых вы обычно хотите запустить определенный набор правил против вашего кода, но в конкретных случаях необходимо игнорировать в противном случае действительное нарушение.
Общим примером являются нарушения CFQueryParam_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 , поведение по умолчанию -RuleGroups! Экспериментально)-includeRule и -excludeRule )Правило конфигурации, наиболее близкое к правилу, является тем, которое вступает в силу.
.cflintrc добавит его обратно, оно будет стрелять для исходных файлов в этой части исходного дерева.-includeRule "MISSING_VAR,CFQUERYPARAM_REQ" Cflint поддерживает различные параметры отчетности и вывода, которые вы можете управлять с помощью флагов командной строки. Помимо целевых форматов вывода текста, XML, JSON или HTML, вы также можете запустить CFLINT с параметрами для тихого, словесного и отладки.
Если вообще не указан целевой формат вывода, CFLINT по умолчанию будет создавать отчет HTML в файле cflint-result.html .
Вы можете привязать выходное поведение CFLINT в Stdout и Stderr, указав параметры для тихого, словеса и отладки. Если вы также не указаете, Cflint вернет базовую внутреннюю информацию и вывод ошибок в Stdout и Stderr.
Тихий режим ( -quiet <boolean> ) подавляет большую часть выходного CFLINT в противном случае создает во время подножки. Это может содержать фактические ошибки и исключения, а также информацию, такую как завершение рекурсивного анализа шаблона или определенных вопросов конфигурации. Не запускайте тихий режим, если вам, вероятно, понадобится помощь с сообщениями об ошибках или вы хотите лучше понять, что делает CFLINT.
Это минимальный режим вывода, в котором вы можете запустить Cflint, и эта функция была вдохновлена выпуском № 4.
На этом этапе могут быть случайные сообщения от CFPARSER и ANTLR, даже если CFLINT работает в тихом режиме. Это известная проблема и будет рассмотрено в будущем.
Режим словеса ( -verbose <boolean> ) обеспечивает многословную вывод. Он содержит информацию о выбранных форматах вывода и найденных файлах конфигурации и обрабатывает во время личинга, а также работает в настоящее время обработанный файл cflint (показывая только файлы, которые фактически сканируются).
Если вам нужна дополнительная информация о внутренней работе CFLINT во время выполнения, режим Verbose - это минимум, в котором вы должны запустить CFLINT.
Режим отладки ( -debug <boolean> ) позволяет отладку вывода. Режим отладки подразумевает режим Verbose, но добавляет дополнительную информацию, такую как токены синтаксического анализатора, и каждый обработанный файл (независимо от того, что поддерживается вашим списком расширения или расширением по умолчанию) в выходные потоки.
Можно одновременно включить и запустить тихий, многословные режимы и отладка. Это частично предназначено, так как вы, возможно, не захотите видеть, что информация об ошибках подавляется в тихом режиме, но все же хочет, чтобы определенная информация, показанная в режиме VERBOSE. Пожалуйста, возьмите это поведение с зерном соли -может быть странный сценарий, в котором комбинирование -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-/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
Чтобы напрямую взаимодействовать с CFLINT в JVM, используйте API CFLINT.
import com . cflint . api . CFLintAPI ;
import com . cflint . api . CFLintResult ;
CFLintAPI api = new CFLintAPI ();
CFLintResult result = api . scan ( filename );
String jsonResult = result . getJSON ();Для Дженкинса , пожалуйста, посмотрите на плагин Jenkins/Hudson, упомянутый ниже.
TeamCity Jetbrains имеет поддержку отчетов об инспекции кода FindBugs XML. Они могут быть произведены из коробки с помощью Cflint с 1.2.0 (см. Выше в разделе Findbugs XML).
Существует поддержка Sonarqube через плагин Stepstone Sonar Coldfusion, упомянутый ниже.
Для Azure DevOps/TFS , пожалуйста, посмотрите на расширение сборки Azure/TFS, упомянутое ниже.
Внизу есть обертка NPM для CFLINT. Пожалуйста, имейте в виду, что обертка, кажется, поставляется со своим собственным бинарным бинарником, который может быть не обновлен, который находится вне нашего контроля.
Другие продукты в категории Integration/Build Server также могут работать. Если вы используете конкретный продукт, который работает для вас с CFLINT, сообщите нам об этом. Если вы не можете заставить CFLINT работать в использовании, которую вы используете, сообщите нам об этом - мы могли бы помочь.
Есть несколько интеграций IDE для CFLINT, которые доступны. Ниже приведены некоторые краткие описания, но если вы хотите узнать больше, посмотрите на интересные сторонние проекты.
Существует поддержка IDE для Sublime Text 3 через сторонний проект с использованием Sublimelinter.
Существует также поддержка 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 - тег CFMLcontext - текущий файл, который проверяетсяbugs - Докладывающее объект нарушений Самый простой способ достичь этого - это пользовательский файл .cflintrc :
Поле includes поле игнорируется, если это пустой список, поэтому просто добавьте в него один элемент, для которого ничего не соответствует.
{
"code" : " NOTHING "
}или проще:
{}Следующее будет игнорировать все правила в текущей папке и ниже.
{
"rule" : [ ],
"excludes" : [ ],
"includes" : [ {} ],
"inheritParent" : false ,
"parameters" : {}
} Это можно упростить с помощью значений по умолчанию файла .cflintrc :
{
"includes" : [{}],
"inheritParent" : false
}Смотрите обсуждение в выпуске № 290 для получения дополнительной информации.
Параметры в правилах могут быть переопределены в файлах .cflintrc . Используйте имя правила и параметр, соединенный с точкой.
{
"parameters" : {
"VariableNameChecker.maxLength" : " 15 "
}
} Предоставьте файл cflintexclude.json в командной строке с аргументом -filterfile.
Чтобы отфильтровать сообщения Global_VAR в папке «Некоторый пакет location», добавьте следующее в 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 , который вы можете присоединиться и поговорить с большинством постоянных участников и других пользователей.
См. Appling.md для получения дополнительной информации.
Обратите внимание, что большинство библиотек и проектов, упомянутых здесь, не связаны с командой Cflint и поддерживаются и поддерживаются. Пожалуйста, смотрите авторов и сопровождающих соответствующего проекта для поддержки, сначала используя их библиотеки.
Если вы работали над (или думаете о запуске) проекта, связанного с CFLINT, сообщите нам об этом. Мы рады включить соответствующие сторонние проекты в список выше.