From 208c354bb6a311d8090b119721431f5083fbb123 Mon Sep 17 00:00:00 2001 From: KamasamaK Date: Mon, 25 Mar 2024 10:55:49 -0400 Subject: [PATCH] Merge branch 'master' into dev (#732) * v 1.5.0 * Added IntelliJ IDEA Ultimate plugin link * Fixed CFLint version in README.md from 1.4 to 1.5 (#704) * Bump commons-io from 2.5 to 2.7 (#706) Bumps commons-io from 2.5 to 2.7. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump junit from 4.12 to 4.13.1 (#694) Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Updated the gradle wrapper to 6.4 (#703) * Bump ant from 1.7.0 to 1.10.9 (#701) Bumps ant from 1.7.0 to 1.10.9. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump jackson.version from 2.10.1 to 2.12.1 (#702) Bumps `jackson.version` from 2.10.1 to 2.12.1. Updates `jackson-core` from 2.10.1 to 2.12.1 - [Release notes](https://github.com/FasterXML/jackson-core/releases) - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.10.1...jackson-core-2.12.1) Updates `jackson-databind` from 2.10.1 to 2.12.1 - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Updates `jackson-module-jaxb-annotations` from 2.10.1 to 2.12.1 - [Release notes](https://github.com/FasterXML/jackson-modules-base/releases) - [Commits](https://github.com/FasterXML/jackson-modules-base/compare/jackson-modules-base-2.10.1...jackson-modules-base-2.12.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * make all urls https since it will fail with http urls (#725) * Bump com.fasterxml.jackson.core:jackson-databind from 2.10.1 to 2.12.7.1 (#726) Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.10.1 to 2.12.7.1. - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump org.apache.ant:ant from 1.10.9 to 1.10.11 (#727) Bumps org.apache.ant:ant from 1.10.9 to 1.10.11. --- updated-dependencies: - dependency-name: org.apache.ant:ant dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add Gradle GitHub Action (#728) * Update Rules (#729) * Updated RULES writer * Updated README * Update Gradle to 6.9.4 (#731) --------- Signed-off-by: dependabot[bot] Co-authored-by: Ryan Co-authored-by: Pr1st0n Co-authored-by: Kai Koenig Co-authored-by: Ed Bartram Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andy Jarrett Co-authored-by: Travis Frisinger --- .github/workflows/gradle.yml | 32 + README.md | 35 +- RULES.md | 1439 ++++++++++++----- build.gradle | 27 +- gradle/wrapper/gradle-wrapper.jar | Bin 54227 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 11 +- gradlew | 43 +- gradlew.bat | 6 +- pom.xml | 136 +- src/main/java/com/cflint/cli/CFLintCLI.java | 4 +- src/main/java/com/cflint/tools/CFLintDoc.java | 73 +- src/main/resources/cflint.description.txt | 26 +- 12 files changed, 1252 insertions(+), 580 deletions(-) create mode 100644 .github/workflows/gradle.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 000000000..566bc03f7 --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,32 @@ +name: Gradle + +on: + pull_request: + branches: + - main + - master + - dev + +jobs: + gradle: + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 8 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 8 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + with: + gradle-version: wrapper + + - name: Build with Gradle + run: ./gradlew build \ No newline at end of file diff --git a/README.md b/README.md index e44012b86..c6e688427 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,20 @@ ![CFLint](/src/main/resources/CFLint-logo.jpg) -# CFLint [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.cflint/CFLint/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.cflint/CFLint) [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/6f4b01d4d2cb4860b60ac666452071f1)](https://www.codacy.com/app/ryaneberly/CFLint?utm_source=github.com&utm_medium=referral&utm_content=cflint/CFLint&utm_campaign=Badge_Grade) [![Build Status](https://travis-ci.org/cflint/CFLint.svg?branch=master)](https://travis-ci.org/cflint/CFLint) +# CFLint + +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.cflint/CFLint/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.cflint/CFLint) [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/6f4b01d4d2cb4860b60ac666452071f1)](https://www.codacy.com/app/ryaneberly/CFLint?utm_source=github.com&utm_medium=referral&utm_content=cflint/CFLint&utm_campaign=Badge_Grade) [![Build Status](https://travis-ci.org/cflint/CFLint.svg?branch=master)](https://travis-ci.org/cflint/CFLint) A static code analysis tool for CFML. License: [BSD](https://opensource.org/licenses/bsd-license.html) -Current Version: 1.4.1 +Current Version: 1.5.x -# Versions +## Versions See [CHANGELOG.md](/CHANGELOG.md) for further information. -# Project and library organization +## Project and library organization CFLint is a project developed and worked on by volunteers. When logging issues please, be nice and considerate. We're here to help. We really appreciate fixes and improvements, so feel free to talk to us and/or provide pull requests. @@ -20,7 +22,7 @@ CFLint is a project developed and worked on by volunteers. When logging issues p The master branch is considered our stable codebase. Most of the development happens in the dev branch resp. local development branches for specific issues. -# Building CFLint +## Building CFLint 1. Fork the repository into your account and clone or download the codebase as a zip-file. 1. Install the tooling of your choice and build via Gradle or Maven (deprecated). CFLint requires Java 8. @@ -39,7 +41,7 @@ The master branch is considered our stable codebase. Most of the development hap Alternatively, import the CFLint codebase into the IDE of your choice and use its respectively Gradle/Maven integration. This should work out of the box for Eclipse and IntelliJ users. -# Using CFLint - Quickstart Guide +## Using CFLint - Quickstart Guide Get the latest version from [Maven Central](https://search.maven.org/search?q=cflint) or the [CFLint GitHub release page](https://github.com/cflint/CFLint/releases) or build the project. @@ -65,21 +67,21 @@ Or always use the latest: With the binaries retrieved one or the other way, you can now use CFLint on the command line. -#### Use the "-all"-version of the jar-file +### Use the "-all"-version of the jar-file - CFLint-1.4.1-all.jar + CFLint-1.5.0-all.jar -#### Scan a folder with the complete set of rules +### Scan a folder with the complete set of rules - java -jar CFLint-1.4.1-all.jar -folder + java -jar CFLint-1.5.0-all.jar -folder -#### Scan a file with the complete set of rules +### Scan a file with the complete set of rules - java -jar CFLint-1.4.1-all.jar -file + java -jar CFLint-1.5.0-all.jar -file -#### See parameters and help +### See command line parameters and help - java -jar CFLint-1.4.1-all.jar -help + java -jar CFLint-1.5.0-all.jar -help # User manual @@ -131,13 +133,13 @@ An example `.cflintrc` file is shown below: * `inheritParent` configures if the rules set in the global or any parent configuration should be inherited as a base set of rules. -* `parameters` allows configuration of rule parameters. See `cflint.definition.json` for the parameters and their defaults. +* `parameters` allows configuration of rules. See [RULES.md](/RULES.md) for the parameters of each rule and their defaults. You must precede the parameter name with the rule name separated by a dot. * Please note: `inheritPlugins` and `output` were marked deprecated in CFLint 1.2.0 and removed in 1.4.0. Plugin inheritance is now always treated as true since the team cannot see a use case in which it should be disabled. The output type can be controlled elsewhere, such as command-line flags. We provide a [schema with the deprecated properties excluded](/src/main/resources/schemas/.cflintrc.schema.json). -More examples of `.cflintrc` files can be found by browsing the [project test files](/src/test/resources/com/cflint/tests). +See [Recipes](#recipes) for some usage examples of `.cflintrc`. Example files can be found by browsing the [project test files](/src/test/resources/com/cflint/tests). ### Annotation-based configuration @@ -567,5 +569,6 @@ Please note that the majority of the libraries and projects mentioned here are n * [SonarQube plugin](https://github.com/stepstone-tech/sonar-coldfusion) * [NPM wrapper](https://github.com/morgdenn/npm-cflint) * Vim [Syntastic support for CFLint](https://github.com/cflint/cflint-syntastic) +* [IntelliJ IDEA Ultimate plugin](https://github.com/Pr1st0n/cflint-intellij) If you have been working on (or are thinking about starting) a project related to CFLint, please let us know. We're happy to include relevant third-party projects to the list above. diff --git a/RULES.md b/RULES.md index 931440af9..a48dbf22c 100644 --- a/RULES.md +++ b/RULES.md @@ -1,416 +1,1045 @@ -List of built-in rules and rule groups -====================================== -## Rule Parameters -
FunctionLengthChecker.length = *100* -
ComponentLengthChecker.length = *500* -
TooManyArgumentsChecker.maximum = *10* -
TooManyFunctionsChecker.maximum = *10* -
SimpleComplexityChecker.maximum = *10* -
VariableNameChecker.minLength = *3* -
VariableNameChecker.maxLength = *20* -
VariableNameChecker.maxWords = *4* -
VariableNameChecker.ignoreUpperCaseScopes = *CGI,URL* -
VariableNameChecker.ignoreAllCapsInScopes = *this,variables* -
VariableNameChecker.ignorePrefixPostfixOn = *thisTag* -
VariableNameChecker.case = *camelCase* -
ArgumentNameChecker.minLength = *3* -
ArgumentNameChecker.maxLength = *20* -
ArgumentNameChecker.maxWords = *4* -
ArgumentNameChecker.case = *camelCase* -
MethodNameChecker.minLength = *3* -
MethodNameChecker.maxLength = *25* -
MethodNameChecker.maxWords = *5* -
MethodNameChecker.case = *camelCase* -
ComponentNameChecker.minLength = *3* -
ComponentNameChecker.maxLength = *15* -
ComponentNameChecker.maxWords = *3* -
ComponentNameChecker.case = *PascalCase* -
GlobalLiteralChecker.maximum = *3* -
GlobalLiteralChecker.maxWarnings = *5* -
GlobalLiteralChecker.warningScope = *global* -
GlobalLiteralChecker.ignoreWords = *numeric,text,textnocase,asc,desc,in,out,inout,one,all,bigdecimal,boolean,byte,char,int,long,float,double,short,string,null* -
LocalLiteralChecker.maximum = *3* -
LocalLiteralChecker.maxWarnings = *5* -
LocalLiteralChecker.warningScope = *local* -
LocalLiteralChecker.ignoreWords = *numeric,text,textnocase,asc,desc,in,out,inout,one,all,bigdecimal,boolean,byte,char,int,long,float,double,short,string,null* -## Built-in rules -* ArgDefChecker - * ARG_DEFAULT_MISSING - Optional argument is missing a default value. *WARNING* - * Argument *variable* is not required and does not define a default value. -* ArgVarChecker - * ARG_VAR_CONFLICT - Variable declared in both local and argument scopes. *ERROR* - * Variable *variable* should not be declared in both local and argument scopes. - * ARG_VAR_MIXED - Variable referenced in local and argument scopes. *INFO* - * Variable *variable* should not be referenced in local and argument scope. -* CFSwitchDefaultChecker - * NO_DEFAULT_INSIDE_SWITCH - Missing default switch statement. *WARNING* - * Not having a Default statement defined for a switch could pose potential issues. -* GlobalVarChecker - * GLOBAL_VAR - Global variable exists. *WARNING* - * Identifier *variable* is global. Referencing in a CFC or function should be avoided. -* NestedCFOutput - * NESTED_CFOUTPUT - Nexted cfoutput with cfquery tag. *ERROR* - * Nested CFOutput, outer CFOutput has @query. -* OutputParmMissing - * OUTPUT_ATTR - Tag should have output='false'. *INFO* - * <*tag* name="*variable*"> should have @output='false' -* QueryParamChecker - * QUERYPARAM_REQ - SetSql() statement should use .addParam(). *WARNING* - * setSql() statement should use .addParam() instead of #'s name="*variable*" - * CFQUERYPARAM_REQ - cfquery should use <cfqueryparam>. *WARNING* - * <*tag*> should use <cfqueryparam/> for variable '*variable*'. -* TypedQueryNew - * QUERYNEW_DATATYPE - QueryNew statement should specify datatypes. *WARNING* - * QueryNew statement should specify datatypes. -* VarScoper - * MISSING_VAR - Variable is not declared with a var statement. *ERROR* - * Variable *variable* is not declared with a var statement. -* CFDumpChecker - * Parameters - * tagName = *cfdump* - * AVOID_USING_CFDUMP_TAG - Avoid use of cfdump tags. *WARNING* - * Avoid leaving <cfdump> tags in committed code. Debug information should be omitted from release code -* CFExecuteChecker - * Parameters - * tagName = *cfexecute* - * AVOID_USING_CFEXECUTE_TAG - Avoid use of cfexecute tags. *WARNING* - * Avoid leaving <cfexecute> tags in committed code. CFexecute can be used as an attack vector and is slow. -* CFBuiltInFunctionChecker - * AVOID_USING_ISDATE - *WARNING* - * Avoid using the isDate built-in function. It is too permissive. Use isValid() instead. -* CFAbortChecker - * Parameters - * tagName = *cfabort* - * AVOID_USING_CFABORT_TAG - Avoid use of cfabort tags. *INFO* - * Avoid leaving <cfabort> tags in committed code. -* AbortChecker - * AVOID_USING_ABORT - Avoid use of abort statements. *INFO* - * Avoid using abort in production code. -* CFInsertChecker - * Parameters - * tagName = *cfinsert* - * AVOID_USING_CFINSERT_TAG - Avoid use of cfinsert tags. *WARNING* - * Avoid using <cfinsert> tags. Use cfquery and cfstoredproc instead. -* CFModuleChecker - * Parameters - * tagName = *cfmodule* - * AVOID_USING_CFMODULE_TAG - Avoid use of cfmodule tags. *WARNING* - * Avoid using <cfmodule> tags. -* CFUpdateChecker - * Parameters - * tagName = *cfupdate* - * AVOID_USING_CFUPDATE_TAG - Avoid use of cfupdate tags. *WARNING* - * Avoid using <cfupdate> tags. Use cfquery and cfstoredproc instead. -* CFIncludeChecker - * Parameters - * tagName = *cfinclude* - * scope = *component* - * AVOID_USING_CFINCLUDE_TAG - Avoid use of cfinclude tags. *WARNING* - * Avoid using <cfinclude> tags. Use components instead. -* ComponentHintChecker - * COMPONENT_HINT_MISSING - Component is missing a hint. *WARNING* - * Component *variable* is missing a hint. -* FunctionHintChecker - * FUNCTION_HINT_MISSING - Function is missing a hint. *INFO* - * Function *variable* is missing a hint. -* ArgumentHintChecker - * ARG_HINT_MISSING - Argument is missing a hint. *INFO* - * Argument *variable* is missing a hint. - * ARG_HINT_MISSING_SCRIPT - *INFO* - * Argument *variable* is missing a hint. Use javadoc style annotations on cfscript functions. -* ArgumentTypeChecker - * ARG_TYPE_MISSING - Component is missing a type. *WARNING* - * Argument *variable* is missing a type. - * ARG_TYPE_ANY - Component is of type any. *WARNING* - * Argument *variable* is any. Please change to be a more specific type. -* FunctionLengthChecker - * Parameters - * length = *100* - * EXCESSIVE_FUNCTION_LENGTH - Method is too long. *WARNING* - * Function *function* is *variable* lines. Should be fewer than 100 lines. -* ComponentLengthChecker - * Parameters - * length = *500* - * EXCESSIVE_COMPONENT_LENGTH - Component is too long. *WARNING* - * Component *component* is *variable* lines. Should be fewer than 500 lines. -* FunctionTypeChecker - * FUNCTION_TYPE_MISSING - Function is missing a return type. *WARNING* - * Function *variable* is missing a return type. - * FUNCTION_TYPE_ANY - Function has a return type of any. *INFO* - * Function *variable* return type is any. Please change to be a more specific type. -* TooManyArgumentsChecker - * Parameters - * maximum = *10* - * EXCESSIVE_ARGUMENTS - Function has too many arguments. *WARNING* - * Function *function* has too many arguments. Should be fewer than 10. -* TooManyFunctionsChecker - * Parameters - * maximum = *10* - * EXCESSIVE_FUNCTIONS - Too many functions. *WARNING* - * Component *component* has too many functions. Should be fewer than 10. -* SimpleComplexityChecker - * Parameters - * maximum = *10* - * FUNCTION_TOO_COMPLEX - Function is too complex. *WARNING* - * Function *function* is too complex. Consider breaking the function into smaller functions. -* WriteDumpChecker - * Parameters - * functionName = *writeDump* - * AVOID_USING_WRITEDUMP - Avoid use of writedump statements. *INFO* - * Avoid using the writeDump function in production code. -* StructNewChecker - * Parameters - * functionName = *structNew* - * AVOID_USING_STRUCTNEW - Avoid use of structnew statements. Use {} instead. *INFO* - * Avoid using the structNew function in production code. -* IsDebugModeChecker - * Parameters - * functionName = *IsDebugMode* - * AVOID_USING_ISDEBUGMODE - Avoid use of isdebugmode statements. *WARNING* - * Avoid using the IsDebugMode function in production code. -* ArrayNewChecker - * AVOID_USING_ARRAYNEW - Avoid use of arraynew statements. Use [] instead. *INFO* - * Use implict array construction instead (= []). -* ComplexBooleanExpressionChecker - * COMPLEX_BOOLEAN_CHECK - Complex boolean expression. *WARNING* - * Boolean expression is too complex. Consider simplifying or moving to a named method. -* BooleanExpressionChecker - * EXPLICIT_BOOLEAN_CHECK - Checking boolean expression explicitly. *INFO* - * Explicit check of boolean expression is not needed. -* VariableNameChecker - * Parameters - * minLength = *3* - * maxLength = *20* - * maxWords = *4* - * ignoreUpperCaseScopes = *CGI,URL* - * ignoreAllCapsInScopes = *this,variables* - * ignorePrefixPostfixOn = *thisTag* - * case = *camelCase* - * VAR_INVALID_NAME - Variable has invalid name. *INFO* - * Variable *variable* is not a valid name. Please use camelCase or underscores. - * VAR_ALLCAPS_NAME - Variable name is allcaps. *INFO* - * Variable *variable* should not be upper case. - * SCOPE_ALLCAPS_NAME - Variable scope name is allcaps. *INFO* - * Scope *variable* should not be upper case. - * VAR_TOO_SHORT - Variable name is too short. *INFO* - * Variable *variable* should be longer than 3 characters. - * VAR_TOO_LONG - Variable name is too long. *INFO* - * Variable *variable* should be shorter than 20 characters. - * VAR_TOO_WORDY - Variable name contain too many words. *INFO* - * Variable *variable* is too wordy. Try to think of a more concise name. - * VAR_IS_TEMPORARY - Variable name looks temporary. *INFO* - * Temporary variable *variable* could be named better. - * VAR_HAS_PREFIX_OR_POSTFIX - Variable name has prefix or postfix. *INFO* - * Variable has prefix or postfix *variable* and could be named better. -* ArgumentNameChecker - * Parameters - * minLength = *3* - * maxLength = *20* - * maxWords = *4* - * case = *camelCase* - * ARGUMENT_MISSING_NAME - *INFO* - * Argument is missing a name. - * ARGUMENT_INVALID_NAME - Argument has invalid name. *INFO* - * Argument *variable* is not a valid name. Please use camelCase or underscores. - * ARGUMENT_ALLCAPS_NAME - Argument name is allcaps. *INFO* - * Argument *variable* should not be upper case. - * ARGUMENT_TOO_SHORT - Argument name is too short. *INFO* - * Argument *variable* should be longer than 3 characters. - * ARGUMENT_TOO_LONG - Argument name is too long. *INFO* - * Argument *variable* should be shorter than 20 characters. - * ARGUMENT_TOO_WORDY - Argument name contain too many words. *INFO* - * Argument *variable* is too wordy. Try to think of a more concise name. - * ARGUMENT_IS_TEMPORARY - Argument name looks temporary. *INFO* - * Temporary argument *variable* could be named better. - * ARGUMENT_HAS_PREFIX_OR_POSTFIX - Argument name has prefix or postfix. *INFO* - * Argument has prefix or postfix *variable* and could be named better. -* MethodNameChecker - * Parameters - * minLength = *3* - * maxLength = *25* - * maxWords = *5* - * case = *camelCase* - * METHOD_INVALID_NAME - Method has invalid name. *INFO* - * Method name *function* is not a valid name. Please use camelCase or underscores. - * METHOD_ALLCAPS_NAME - Method name is allcaps. *INFO* - * Method name *function* should not be upper case. - * METHOD_TOO_SHORT - Method name is too short. *INFO* - * Method name *function* should be longer than 3 characters. - * METHOD_TOO_LONG - Method name is too long. *INFO* - * Method name *function* should be shorter than 25 characters. - * METHOD_TOO_WORDY - Method name contain too many words. *INFO* - * Method name *function* is too wordy. Try to think of a more concise name. - * METHOD_IS_TEMPORARY - Method name looks temporary. *INFO* - * Method name *function* could be named better. - * METHOD_HAS_PREFIX_OR_POSTFIX - Method name has prefix or postfix. *INFO* - * Method name *function* has prefix or postfix and could be named better. -* ComponentNameChecker - * Parameters - * minLength = *3* - * maxLength = *15* - * maxWords = *3* - * case = *PascalCase* - * COMPONENT_INVALID_NAME - Component has invalid name. *INFO* - * Component name *component* is not a valid name. Please use PascalCase and start with a capital letter. - * COMPONENT_ALLCAPS_NAME - Component name is allcaps. *INFO* - * Component name *component* should not be all upper case. - * COMPONENT_TOO_SHORT - Component name is too short. *INFO* - * Component name *component* should be longer than 3 characters. - * COMPONENT_TOO_LONG - Component name is too long. *INFO* - * Component name *component* should be shorter than 15 characters. - * COMPONENT_TOO_WORDY - Component name contain too many words. *INFO* - * Component name *component* is too wordy. Try to think of a more concise name. - * COMPONENT_IS_TEMPORARY - Component name looks temporary. *INFO* - * Component name *component* could be named better. - * COMPONENT_HAS_PREFIX_OR_POSTFIX - Component name has prefix or postfix. *INFO* - * Component name *component* has prefix or postfix and could be named better. -* FileCaseChecker - * FILE_SHOULD_START_WITH_LOWERCASE - CFM File starts with upper case. *INFO* - * File *filename* starts with an upper case letter. Only components (.cfc files) should start with an upper case letter. -* CreateObjectChecker - * AVOID_USING_CREATEOBJECT - Avoid use of creatobject statements. *INFO* - * CreateObject found. Use createObject(path_to_component) or even better new path_to_component(). -* CFDebugAttributeChecker - * AVOID_USING_DEBUG_ATTR - Avoid use of debug attribute. *WARNING* - * Avoid leaving debug attribute on tags. - * AVOID_USING_CFSETTING_DEBUG - Avoid using showDebugOutput attribute on cfsetting. *WARNING* - * Avoid using showDebugOutput attribute on cfsetting. -* UnusedLocalVarChecker - * Parameters - * usedTagAttributes = *[cfquery/name, cfloop/index, cfloop/item, cfchart/name, cfdocument/name, cfftp/name, cfhtmltopdf/name, cfhttp/resultname, cfimage/name, cfimap/name, cfldap/name, cfoutput/query, cfpdf/name, cfreport/name, cfsavecontent/name, cfstoreproc/result, cfxml/variable]* - * UNUSED_LOCAL_VARIABLE - Unused local variable. *INFO* - * Local variable *variable* is not used in function *function*. Consider removing it. -* UnusedArgumentChecker - * UNUSED_METHOD_ARGUMENT - Unused method argument. *INFO* - * Argument *variable* is not used in function. Consider removing it. -* CFCompareVsAssignChecker - * COMPARE_INSTEAD_OF_ASSIGN - Using comparision where assignment was probably meant. *WARNING* - * CWE-482: Comparing instead of Assigning -* StructKeyChecker - * UNQUOTED_STRUCT_KEY - *WARNING* - * Unquoted struct key *variable* is not case-sensitive. Quoting it is recommended. - * STRUCT_ARRAY_NOTATION - *WARNING* - * Unquoted struct key *variable* is not case-sensitive. Using array notation is recommended. -* SelectStarChecker - * SQL_SELECT_STAR - *WARNING* - * Avoid using 'select *' in a query. -* CFQueryChecker - * NEVER_USE_QUERY_IN_CFM - ** - * Don't use <cfquery> in .cfm files. Database should not be coupled with view. -* ComponentDisplayNameChecker - * USE_DISPLAY_NAME - *INFO* - * Component *variable* has a name attribute, but perhaps you meant to use displayName. -* GlobalLiteralChecker - * Parameters - * maximum = *3* - * maxWarnings = *5* - * warningScope = *global* - * ignoreWords = *numeric,text,textnocase,asc,desc,in,out,inout,one,all,bigdecimal,boolean,byte,char,int,long,float,double,short,string,null* - * GLOBAL_LITERAL_VALUE_USED_TOO_OFTEN - *WARNING* - * Literal *variable* occurs several times in one or more files. Consider giving it a name and not hard coding values. -* LocalLiteralChecker - * Parameters - * maximum = *3* - * maxWarnings = *5* - * warningScope = *local* - * ignoreWords = *numeric,text,textnocase,asc,desc,in,out,inout,one,all,bigdecimal,boolean,byte,char,int,long,float,double,short,string,null* - * LOCAL_LITERAL_VALUE_USED_TOO_OFTEN - *WARNING* - * Literal *variable* occurs several times in the same file. Consider giving it a name and not hard coding values. -* PackageCaseChecker - * PACKAGE_CASE_MISMATCH - Warn with package case does not match its use. *WARNING* - * The case of the package folder and the object declaration do not match for *variable*. +# Built-in Rules + +## Rule List + +### ArgDefChecker + +#### ARG_DEFAULT_MISSING + +Optional argument is missing a default value. + +**Severity**: WARNING + +**Message**: Argument *variable* is not required and does not define a default value. + +### ArgVarChecker + +#### ARG_VAR_CONFLICT + +Variable declared in both local and argument scopes. + +**Severity**: ERROR + +**Message**: Variable *variable* should not be declared in both local and argument scopes. + +#### ARG_VAR_MIXED + +Variable referenced in local and argument scopes. + +**Severity**: INFO + +**Message**: Variable *variable* should not be referenced in local and argument scope. + +### CFSwitchDefaultChecker + +#### NO_DEFAULT_INSIDE_SWITCH + +Missing default switch statement. + +**Severity**: WARNING + +**Message**: Not having a Default statement defined for a switch could pose potential issues. + +### GlobalVarChecker + +#### GLOBAL_VAR + +Global variable exists. + +**Severity**: WARNING + +**Message**: Identifier *variable* is global. Referencing in a CFC or function should be avoided. + +### NestedCFOutput + +#### NESTED_CFOUTPUT + +Nested cfoutput with cfquery tag. + +**Severity**: ERROR + +**Message**: Nested CFOutput, outer CFOutput has @query. + +### OutputParmMissing + +#### OUTPUT_ATTR + +Tag should have output='false'. + +**Severity**: INFO + +**Message**: <*tag* name="*variable*"> should have @output='false' + +### QueryParamChecker + +#### QUERYPARAM_REQ + +Use query parameters for variables in sql statements. + +**Severity**: WARNING + +**Message**: Use query parameters for variables in sql statements. + +#### CFQUERYPARAM_REQ + +cfquery should use <cfqueryparam>. + +**Severity**: WARNING + +**Message**: <*tag*> should use <cfqueryparam/> for variable '*variable*'. + +### TypedQueryNew + +#### QUERYNEW_DATATYPE + +QueryNew statement should specify data types. + +**Severity**: WARNING + +**Message**: QueryNew statement should specify datatypes. + +### VarScoper + +#### MISSING_VAR + +Variable is not declared with a var statement. + +**Severity**: ERROR + +**Message**: Variable *variable* is not declared with a var statement. + +### CFDumpChecker + +#### AVOID_USING_CFDUMP_TAG + +Avoid use of cfdump tags. + +**Severity**: WARNING + +**Message**: Avoid leaving <cfdump> tags in committed code. Debug information should be omitted from release code + +### CFExecuteChecker + +#### AVOID_USING_CFEXECUTE_TAG + +Avoid use of cfexecute tags. + +**Severity**: WARNING + +**Message**: Avoid leaving <cfexecute> tags in committed code. CFexecute can be used as an attack vector and is slow. + +### CFBuiltInFunctionChecker + +#### AVOID_USING_ISDATE + +**Severity**: WARNING + +**Message**: Avoid using the isDate built-in function. It is too permissive. Use isValid() instead. + +### CFAbortChecker + +#### AVOID_USING_CFABORT_TAG + +Avoid use of cfabort tags. + +**Severity**: INFO + +**Message**: Avoid leaving <cfabort> tags in committed code. + +### AbortChecker + +#### AVOID_USING_ABORT + +Avoid use of abort statements. + +**Severity**: INFO + +**Message**: Avoid using abort in production code. + +### CFInsertChecker + +#### AVOID_USING_CFINSERT_TAG + +Avoid use of cfinsert tags. + +**Severity**: WARNING + +**Message**: Avoid using <cfinsert> tags. Use cfquery and cfstoredproc instead. + +### CFModuleChecker + +#### AVOID_USING_CFMODULE_TAG + +Avoid use of cfmodule tags. + +**Severity**: WARNING + +**Message**: Avoid using <cfmodule> tags. + +### CFUpdateChecker + +#### AVOID_USING_CFUPDATE_TAG + +Avoid use of cfupdate tags. + +**Severity**: WARNING + +**Message**: Avoid using <cfupdate> tags. Use cfquery and cfstoredproc instead. + +### CFIncludeChecker + +#### AVOID_USING_CFINCLUDE_TAG + +Avoid use of cfinclude tags. + +**Severity**: WARNING + +**Message**: Avoid using <cfinclude> tags. Use components instead. + +### ComponentHintChecker + +#### COMPONENT_HINT_MISSING + +Component is missing a hint. + +**Severity**: WARNING + +**Message**: Component *variable* is missing a hint. + +### FunctionHintChecker + +#### FUNCTION_HINT_MISSING + +Function is missing a hint. + +**Severity**: INFO + +**Message**: Function *variable* is missing a hint. + +### ArgumentHintChecker + +#### ARG_HINT_MISSING + +Argument is missing a hint. + +**Severity**: INFO + +**Message**: Argument *variable* is missing a hint. + +#### ARG_HINT_MISSING_SCRIPT + +**Severity**: INFO + +**Message**: Argument *variable* is missing a hint. Use javadoc style annotations on cfscript functions. + +### ArgumentTypeChecker + +#### ARG_TYPE_MISSING + +Component is missing a type. + +**Severity**: WARNING + +**Message**: Argument *variable* is missing a type. + +#### ARG_TYPE_ANY + +Component is of type any. + +**Severity**: WARNING + +**Message**: Argument *variable* is any. Please change to be a more specific type. + +### FunctionLengthChecker + +#### EXCESSIVE_FUNCTION_LENGTH + +Method is too long. + +**Severity**: WARNING + +**Message**: Function *function* is *variable* lines. Should be fewer than 100 lines. + +#### FunctionLengthChecker Parameters + +* length = *100* + +### ComponentLengthChecker + +#### EXCESSIVE_COMPONENT_LENGTH + +Component is too long. + +**Severity**: WARNING + +**Message**: Component *component* is *variable* lines. Should be fewer than 500 lines. + +#### ComponentLengthChecker Parameters + +* length = *500* + +### FunctionTypeChecker + +#### FUNCTION_TYPE_MISSING + +Function is missing a return type. + +**Severity**: WARNING + +**Message**: Function *variable* is missing a return type. + +#### FUNCTION_TYPE_ANY + +Function has a return type of any. + +**Severity**: INFO + +**Message**: Function *variable* return type is any. Please change to be a more specific type. + +### TooManyArgumentsChecker + +#### EXCESSIVE_ARGUMENTS + +Function has too many arguments. + +**Severity**: WARNING + +**Message**: Function *function* has too many arguments. Should be fewer than 10. + +#### TooManyArgumentsChecker Parameters + +* maximum = *10* + +### TooManyFunctionsChecker + +#### EXCESSIVE_FUNCTIONS + +Too many functions. + +**Severity**: WARNING + +**Message**: Component *component* has too many functions. Should be fewer than 10. + +#### TooManyFunctionsChecker Parameters + +* maximum = *10* + +### SimpleComplexityChecker + +#### FUNCTION_TOO_COMPLEX + +Function is too complex. + +**Severity**: WARNING + +**Message**: Function *function* is too complex. Consider breaking the function into smaller functions. + +#### SimpleComplexityChecker Parameters + +* maximum = *10* + +### QueryNewChecker + +#### QUERYNEW_DUPLICATE_COLUMNS + +**Severity**: ERROR + +**Message**: QueryNew declares column *variable* multiple times, this is a hard error in some CFML implementations. + +### WriteDumpChecker + +#### AVOID_USING_WRITEDUMP + +Avoid use of writeDump statements. + +**Severity**: INFO + +**Message**: Avoid using the writeDump function in production code. + +### StructNewChecker + +#### AVOID_USING_STRUCTNEW + +Avoid use of structNew statements. Use {} instead. + +**Severity**: INFO + +**Message**: Avoid using the structNew function in production code. + +### IsDebugModeChecker + +#### AVOID_USING_ISDEBUGMODE + +Avoid use of isDebugMode statements. + +**Severity**: WARNING + +**Message**: Avoid using the IsDebugMode function in production code. + +### FunctionCollisionChecker + +#### FUNCTION_NAME_COLLISION + +**Severity**: WARNING + +**Message**: Avoid using the name *variable* for a function. It is reserved in some CFML implementations. See https://cfdocs.org/*variable* + +### ArrayNewChecker + +#### AVOID_USING_ARRAYNEW + +Avoid use of arrayNew statements. Use [] instead. + +**Severity**: INFO + +**Message**: Use implict array construction instead (= []). + +### ComplexBooleanExpressionChecker + +#### COMPLEX_BOOLEAN_CHECK + +Complex boolean expression. + +**Severity**: WARNING + +**Message**: Boolean expression is too complex. Consider simplifying or moving to a named method. + +### BooleanExpressionChecker + +#### EXPLICIT_BOOLEAN_CHECK + +Checking boolean expression explicitly. + +**Severity**: INFO + +**Message**: Explicit check of boolean expression is not needed. + +### VariableNameChecker + +#### VAR_INVALID_NAME + +Variable has invalid name. + +**Severity**: INFO + +**Message**: Variable *variable* is not a valid name. Please use camelCase or underscores. + +#### VAR_ALLCAPS_NAME + +Variable name is all caps. + +**Severity**: INFO + +**Message**: Variable *variable* should not be upper case. + +#### SCOPE_ALLCAPS_NAME + +Variable scope name is all caps. + +**Severity**: INFO + +**Message**: Scope *variable* should not be upper case. + +#### VAR_TOO_SHORT + +Variable name is too short. + +**Severity**: INFO + +**Message**: Variable *variable* should be longer than 3 characters. + +#### VAR_TOO_LONG + +Variable name is too long. + +**Severity**: INFO + +**Message**: Variable *variable* should be shorter than 20 characters. + +#### VAR_TOO_WORDY + +Variable name contain too many words. + +**Severity**: INFO + +**Message**: Variable *variable* is too wordy. Try to think of a more concise name. + +#### VAR_IS_TEMPORARY + +Variable name looks temporary. + +**Severity**: INFO + +**Message**: Temporary variable *variable* could be named better. + +#### VAR_HAS_PREFIX_OR_POSTFIX + +Variable name has prefix or postfix. + +**Severity**: INFO + +**Message**: Variable has prefix or postfix *variable* and could be named better. + +#### VariableNameChecker Parameters + +* minLength = *3* + +* maxLength = *20* + +* maxWords = *4* + +* ignoreUpperCaseScopes = *CGI,URL* + +* ignoreAllCapsInScopes = *this,variables* + +* ignorePrefixPostfixOn = *thisTag* + +* case = *camelCase* + +### ArgumentNameChecker + +#### ARGUMENT_MISSING_NAME + +**Severity**: INFO + +**Message**: Argument is missing a name. + +#### ARGUMENT_INVALID_NAME + +Argument has invalid name. + +**Severity**: INFO + +**Message**: Argument *variable* is not a valid name. Please use camelCase or underscores. + +#### ARGUMENT_ALLCAPS_NAME + +Argument name is all caps. + +**Severity**: INFO + +**Message**: Argument *variable* should not be upper case. + +#### ARGUMENT_TOO_SHORT + +Argument name is too short. + +**Severity**: INFO + +**Message**: Argument *variable* should be longer than 3 characters. + +#### ARGUMENT_TOO_LONG + +Argument name is too long. + +**Severity**: INFO + +**Message**: Argument *variable* should be shorter than 20 characters. + +#### ARGUMENT_TOO_WORDY + +Argument name contain too many words. + +**Severity**: INFO + +**Message**: Argument *variable* is too wordy. Try to think of a more concise name. + +#### ARGUMENT_IS_TEMPORARY + +Argument name looks temporary. + +**Severity**: INFO + +**Message**: Temporary argument *variable* could be named better. + +#### ARGUMENT_HAS_PREFIX_OR_POSTFIX + +Argument name has prefix or postfix. + +**Severity**: INFO + +**Message**: Argument has prefix or postfix *variable* and could be named better. + +#### ArgumentNameChecker Parameters + +* minLength = *3* + +* maxLength = *20* + +* maxWords = *4* + +* case = *camelCase* + +### MethodNameChecker + +#### METHOD_INVALID_NAME + +Method has invalid name. + +**Severity**: INFO + +**Message**: Method name *function* is not a valid name. Please use camelCase or underscores. + +#### METHOD_ALLCAPS_NAME + +Method name is all caps. + +**Severity**: INFO + +**Message**: Method name *function* should not be upper case. + +#### METHOD_TOO_SHORT + +Method name is too short. + +**Severity**: INFO + +**Message**: Method name *function* should be longer than 3 characters. + +#### METHOD_TOO_LONG + +Method name is too long. + +**Severity**: INFO + +**Message**: Method name *function* should be shorter than 25 characters. + +#### METHOD_TOO_WORDY + +Method name contain too many words. + +**Severity**: INFO + +**Message**: Method name *function* is too wordy. Try to think of a more concise name. + +#### METHOD_IS_TEMPORARY + +Method name looks temporary. + +**Severity**: INFO + +**Message**: Method name *function* could be named better. + +#### METHOD_HAS_PREFIX_OR_POSTFIX + +Method name has prefix or postfix. + +**Severity**: INFO + +**Message**: Method name *function* has prefix or postfix and could be named better. + +#### MethodNameChecker Parameters + +* minLength = *3* + +* maxLength = *25* + +* maxWords = *5* + +* case = *camelCase* + +### ComponentNameChecker + +#### COMPONENT_INVALID_NAME + +Component has invalid name. + +**Severity**: INFO + +**Message**: Component name *component* is not a valid name. Please use PascalCase and start with a capital letter. + +#### COMPONENT_ALLCAPS_NAME + +Component name is all caps. + +**Severity**: INFO + +**Message**: Component name *component* should not be all upper case. + +#### COMPONENT_TOO_SHORT + +Component name is too short. + +**Severity**: INFO + +**Message**: Component name *component* should be longer than 3 characters. + +#### COMPONENT_TOO_LONG + +Component name is too long. + +**Severity**: INFO + +**Message**: Component name *component* should be shorter than 15 characters. + +#### COMPONENT_TOO_WORDY + +Component name contain too many words. + +**Severity**: INFO + +**Message**: Component name *component* is too wordy. Try to think of a more concise name. + +#### COMPONENT_IS_TEMPORARY + +Component name looks temporary. + +**Severity**: INFO + +**Message**: Component name *component* could be named better. + +#### COMPONENT_HAS_PREFIX_OR_POSTFIX + +Component name has prefix or postfix. + +**Severity**: INFO + +**Message**: Component name *component* has prefix or postfix and could be named better. + +#### ComponentNameChecker Parameters + +* minLength = *3* + +* maxLength = *15* + +* maxWords = *3* + +* case = *PascalCase* + +### FileCaseChecker + +#### FILE_SHOULD_START_WITH_LOWERCASE + +CFM File starts with upper case. + +**Severity**: INFO + +**Message**: File *filename* starts with an upper case letter. Only components (.cfc files) should start with an upper case letter. + +### CreateObjectChecker + +#### AVOID_USING_CREATEOBJECT + +Avoid use of creatObject statements. + +**Severity**: INFO + +**Message**: CreateObject found. Use createObject(path_to_component) or even better new path_to_component(). + +### CFDebugAttributeChecker + +#### AVOID_USING_DEBUG_ATTR + +Avoid use of debug attribute. + +**Severity**: WARNING + +**Message**: Avoid leaving debug attribute on tags. + +#### AVOID_USING_CFSETTING_DEBUG + +Avoid using showDebugOutput attribute on cfsetting. + +**Severity**: WARNING + +**Message**: Avoid using showDebugOutput attribute on cfsetting. + +### UnusedLocalVarChecker + +#### UNUSED_LOCAL_VARIABLE + +Unused local variable. + +**Severity**: INFO + +**Message**: Local variable *variable* is not used in function *function*. Consider removing it. + +### UnusedArgumentChecker + +#### UNUSED_METHOD_ARGUMENT + +Unused method argument. + +**Severity**: INFO + +**Message**: Argument *variable* is not used in function. Consider removing it. + +### CFCompareVsAssignChecker + +#### COMPARE_INSTEAD_OF_ASSIGN + +Using comparison where assignment was probably meant. + +**Severity**: WARNING + +**Message**: CWE-482: Comparing instead of Assigning + +### StructKeyChecker + +#### UNQUOTED_STRUCT_KEY + +**Severity**: WARNING + +**Message**: Unquoted struct key *variable* is not case-sensitive. Quoting it is recommended. + +#### STRUCT_ARRAY_NOTATION + +**Severity**: WARNING + +**Message**: Unquoted struct key *variable* is not case-sensitive. Using array notation is recommended. + +### SelectStarChecker + +#### SQL_SELECT_STAR + +**Severity**: WARNING + +**Message**: Avoid using 'select *' in a query. + +### CFQueryChecker + +#### NEVER_USE_QUERY_IN_CFM + +**Message**: Don't use <cfquery> in .cfm files. Database should not be coupled with view. + +### ComponentDisplayNameChecker + +#### USE_DISPLAY_NAME + +**Severity**: INFO + +**Message**: Component *variable* has a name attribute, but perhaps you meant to use displayName. + +### GlobalLiteralChecker + +#### GLOBAL_LITERAL_VALUE_USED_TOO_OFTEN + +**Severity**: INFO + +**Message**: Literal *variable* occurs several times in one or more files. Consider giving it a name and not hard coding values. + +#### GlobalLiteralChecker Parameters + +* maximum = *3* + +* maxWarnings = *5* + +* warningScope = *global* + +* ignoreWords = *numeric,text,textnocase,asc,desc,in,out,inout,one,all,bigdecimal,boolean,byte,char,int,long,float,double,short,string,null* + +### LocalLiteralChecker + +#### LOCAL_LITERAL_VALUE_USED_TOO_OFTEN + +**Severity**: INFO + +**Message**: Literal *variable* occurs several times in the same file. Consider giving it a name and not hard coding values. + +#### LocalLiteralChecker Parameters + +* maximum = *3* + +* maxWarnings = *5* + +* warningScope = *local* + +* ignoreWords = *numeric,text,textnocase,asc,desc,in,out,inout,one,all,bigdecimal,boolean,byte,char,int,long,float,double,short,string,null* + +### PackageCaseChecker + +#### PACKAGE_CASE_MISMATCH + +Warn with package case does not match its use. + +**Severity**: WARNING + +**Message**: The case of the package folder and the object declaration do not match for *variable*. + ## Rule Groups + ### BugProne - * ARG_VAR_CONFLICT *ERROR* - * NO_DEFAULT_INSIDE_SWITCH *WARNING* - * NESTED_CFOUTPUT *ERROR* - * OUTPUT_ATTR *INFO* - * MISSING_VAR *ERROR* - * COMPARE_INSTEAD_OF_ASSIGN *WARNING* - * AVOID_USING_ISDATE *WARNING* + +* [ARG_VAR_CONFLICT](#arg_var_conflict) + +* [NO_DEFAULT_INSIDE_SWITCH](#no_default_inside_switch) + +* [NESTED_CFOUTPUT](#nested_cfoutput) + +* [OUTPUT_ATTR](#output_attr) + +* [MISSING_VAR](#missing_var) + +* [COMPARE_INSTEAD_OF_ASSIGN](#compare_instead_of_assign) + +* [AVOID_USING_ISDATE](#avoid_using_isdate) + ### Correctness - * ARG_DEFAULT_MISSING *WARNING* - * ARG_TYPE_ANY *WARNING* - * ARG_TYPE_MISSING *WARNING* - * ARG_VAR_MIXED *INFO* - * QUERYNEW_DATATYPE *WARNING* - * UNUSED_LOCAL_VARIABLE *INFO* - * UNUSED_METHOD_ARGUMENT *INFO* - * UNQUOTED_STRUCT_KEY *WARNING* - * STRUCT_ARRAY_NOTATION *WARNING* - * USE_DISPLAY_NAME *INFO* + +* [ARG_DEFAULT_MISSING](#arg_default_missing) + +* [ARG_TYPE_ANY](#arg_type_any) + +* [ARG_TYPE_MISSING](#arg_type_missing) + +* [ARG_VAR_MIXED](#arg_var_mixed) + +* [QUERYNEW_DATATYPE](#querynew_datatype) + +* [UNUSED_LOCAL_VARIABLE](#unused_local_variable) + +* [UNUSED_METHOD_ARGUMENT](#unused_method_argument) + +* [UNQUOTED_STRUCT_KEY](#unquoted_struct_key) + +* [STRUCT_ARRAY_NOTATION](#struct_array_notation) + +* [USE_DISPLAY_NAME](#use_display_name) + ### BadPractice - * AVOID_USING_ABORT *INFO* - * AVOID_USING_CFABORT_TAG *INFO* - * AVOID_USING_CFDUMP_TAG *WARNING* - * AVOID_USING_CFEXECUTE_TAG *WARNING* - * AVOID_USING_CFINSERT_TAG *WARNING* - * AVOID_USING_CFMODULE_TAG *WARNING* - * AVOID_USING_CFUPDATE_TAG *WARNING* - * AVOID_USING_WRITEDUMP *INFO* - * GLOBAL_LITERAL_VALUE_USED_TOO_OFTEN *WARNING* - * GLOBAL_VAR *WARNING* - * LOCAL_LITERAL_VALUE_USED_TOO_OFTEN *WARNING* - * SQL_SELECT_STAR *WARNING* - * AVOID_USING_DEBUG_ATTR *WARNING* - * AVOID_USING_CFSETTING_DEBUG *WARNING* - * AVOID_USING_CFINCLUDE_TAG *WARNING* - * AVOID_USING_ISDEBUGMODE *WARNING* + +* [AVOID_USING_ABORT](#avoid_using_abort) + +* [AVOID_USING_CFABORT_TAG](#avoid_using_cfabort_tag) + +* [AVOID_USING_CFDUMP_TAG](#avoid_using_cfdump_tag) + +* [AVOID_USING_CFEXECUTE_TAG](#avoid_using_cfexecute_tag) + +* [AVOID_USING_CFINSERT_TAG](#avoid_using_cfinsert_tag) + +* [AVOID_USING_CFMODULE_TAG](#avoid_using_cfmodule_tag) + +* [AVOID_USING_CFUPDATE_TAG](#avoid_using_cfupdate_tag) + +* [AVOID_USING_WRITEDUMP](#avoid_using_writedump) + +* [GLOBAL_LITERAL_VALUE_USED_TOO_OFTEN](#global_literal_value_used_too_often) + +* [GLOBAL_VAR](#global_var) + +* [LOCAL_LITERAL_VALUE_USED_TOO_OFTEN](#local_literal_value_used_too_often) + +* [SQL_SELECT_STAR](#sql_select_star) + +* [AVOID_USING_DEBUG_ATTR](#avoid_using_debug_attr) + +* [AVOID_USING_CFSETTING_DEBUG](#avoid_using_cfsetting_debug) + +* [AVOID_USING_CFINCLUDE_TAG](#avoid_using_cfinclude_tag) + +* [AVOID_USING_ISDEBUGMODE](#avoid_using_isdebugmode) + ### Security - * CFQUERYPARAM_REQ *WARNING* - * QUERYPARAM_REQ *WARNING* + +* [CFQUERYPARAM_REQ](#cfqueryparam_req) + +* [QUERYPARAM_REQ](#queryparam_req) + ### CodeStyle - * ARG_HINT_MISSING *INFO* - * COMPONENT_HINT_MISSING *WARNING* - * FUNCTION_HINT_MISSING *INFO* - * FUNCTION_TYPE_ANY *INFO* - * FUNCTION_TYPE_MISSING *WARNING* - * ARG_HINT_MISSING_SCRIPT *INFO* + +* [ARG_HINT_MISSING](#arg_hint_missing) + +* [COMPONENT_HINT_MISSING](#component_hint_missing) + +* [FUNCTION_HINT_MISSING](#function_hint_missing) + +* [FUNCTION_TYPE_ANY](#function_type_any) + +* [FUNCTION_TYPE_MISSING](#function_type_missing) + +* [ARG_HINT_MISSING_SCRIPT](#arg_hint_missing_script) + ### ModernSyntax - * AVOID_USING_ARRAYNEW *INFO* - * AVOID_USING_STRUCTNEW *INFO* - * AVOID_USING_CREATEOBJECT *INFO* + +* [AVOID_USING_ARRAYNEW](#avoid_using_arraynew) + +* [AVOID_USING_STRUCTNEW](#avoid_using_structnew) + +* [AVOID_USING_CREATEOBJECT](#avoid_using_createobject) + ### Complexity - * COMPLEX_BOOLEAN_CHECK *WARNING* - * EXCESSIVE_FUNCTIONS *WARNING* - * EXCESSIVE_ARGUMENTS *WARNING* - * EXPLICIT_BOOLEAN_CHECK *INFO* - * EXCESSIVE_COMPONENT_LENGTH *WARNING* - * EXCESSIVE_FUNCTION_LENGTH *WARNING* - * FUNCTION_TOO_COMPLEX *WARNING* + +* [COMPLEX_BOOLEAN_CHECK](#complex_boolean_check) + +* [EXCESSIVE_FUNCTIONS](#excessive_functions) + +* [EXCESSIVE_ARGUMENTS](#excessive_arguments) + +* [EXPLICIT_BOOLEAN_CHECK](#explicit_boolean_check) + +* [EXCESSIVE_COMPONENT_LENGTH](#excessive_component_length) + +* [EXCESSIVE_FUNCTION_LENGTH](#excessive_function_length) + +* [FUNCTION_TOO_COMPLEX](#function_too_complex) + ### Naming - * METHOD_HAS_PREFIX_OR_POSTFIX *INFO* - * METHOD_INVALID_NAME *INFO* - * METHOD_IS_TEMPORARY *INFO* - * METHOD_TOO_SHORT *INFO* - * METHOD_TOO_LONG *INFO* - * METHOD_TOO_WORDY *INFO* - * VAR_ALLCAPS_NAME *INFO* - * VAR_HAS_PREFIX_OR_POSTFIX *INFO* - * VAR_INVALID_NAME *INFO* - * VAR_IS_TEMPORARY *INFO* - * VAR_TOO_SHORT *INFO* - * VAR_TOO_LONG *INFO* - * VAR_TOO_WORDY *INFO* - * SCOPE_ALLCAPS_NAME *INFO* - * ARGUMENT_MISSING_NAME *INFO* - * ARGUMENT_INVALID_NAME *INFO* - * ARGUMENT_ALLCAPS_NAME *INFO* - * ARGUMENT_TOO_SHORT *INFO* - * ARGUMENT_TOO_LONG *INFO* - * ARGUMENT_TOO_WORDY *INFO* - * ARGUMENT_IS_TEMPORARY *INFO* - * ARGUMENT_HAS_PREFIX_OR_POSTFIX *INFO* - * METHOD_ALLCAPS_NAME *INFO* - * COMPONENT_INVALID_NAME *INFO* - * COMPONENT_ALLCAPS_NAME *INFO* - * COMPONENT_TOO_SHORT *INFO* - * COMPONENT_TOO_LONG *INFO* - * COMPONENT_TOO_WORDY *INFO* - * COMPONENT_IS_TEMPORARY *INFO* - * COMPONENT_HAS_PREFIX_OR_POSTFIX *INFO* - * PACKAGE_CASE_MISMATCH *WARNING* + +* [METHOD_HAS_PREFIX_OR_POSTFIX](#method_has_prefix_or_postfix) + +* [METHOD_INVALID_NAME](#method_invalid_name) + +* [METHOD_IS_TEMPORARY](#method_is_temporary) + +* [METHOD_TOO_SHORT](#method_too_short) + +* [METHOD_TOO_LONG](#method_too_long) + +* [METHOD_TOO_WORDY](#method_too_wordy) + +* [VAR_ALLCAPS_NAME](#var_allcaps_name) + +* [VAR_HAS_PREFIX_OR_POSTFIX](#var_has_prefix_or_postfix) + +* [VAR_INVALID_NAME](#var_invalid_name) + +* [VAR_IS_TEMPORARY](#var_is_temporary) + +* [VAR_TOO_SHORT](#var_too_short) + +* [VAR_TOO_LONG](#var_too_long) + +* [VAR_TOO_WORDY](#var_too_wordy) + +* [SCOPE_ALLCAPS_NAME](#scope_allcaps_name) + +* [ARGUMENT_MISSING_NAME](#argument_missing_name) + +* [ARGUMENT_INVALID_NAME](#argument_invalid_name) + +* [ARGUMENT_ALLCAPS_NAME](#argument_allcaps_name) + +* [ARGUMENT_TOO_SHORT](#argument_too_short) + +* [ARGUMENT_TOO_LONG](#argument_too_long) + +* [ARGUMENT_TOO_WORDY](#argument_too_wordy) + +* [ARGUMENT_IS_TEMPORARY](#argument_is_temporary) + +* [ARGUMENT_HAS_PREFIX_OR_POSTFIX](#argument_has_prefix_or_postfix) + +* [METHOD_ALLCAPS_NAME](#method_allcaps_name) + +* [COMPONENT_INVALID_NAME](#component_invalid_name) + +* [COMPONENT_ALLCAPS_NAME](#component_allcaps_name) + +* [COMPONENT_TOO_SHORT](#component_too_short) + +* [COMPONENT_TOO_LONG](#component_too_long) + +* [COMPONENT_TOO_WORDY](#component_too_wordy) + +* [COMPONENT_IS_TEMPORARY](#component_is_temporary) + +* [COMPONENT_HAS_PREFIX_OR_POSTFIX](#component_has_prefix_or_postfix) + +* [PACKAGE_CASE_MISMATCH](#package_case_mismatch) + ### Experimental - * NEVER_USE_QUERY_IN_CFM ** - * FILE_SHOULD_START_WITH_LOWERCASE *INFO* +* [NEVER_USE_QUERY_IN_CFM](#never_use_query_in_cfm) + +* [FILE_SHOULD_START_WITH_LOWERCASE](#file_should_start_with_lowercase) diff --git a/build.gradle b/build.gradle index 658444755..bb17b3bd2 100644 --- a/build.gradle +++ b/build.gradle @@ -10,17 +10,20 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } + maven { + url "https://cfmlprojects.org/artifacts" + } } dependencies { classpath 'com.bmuschko:gradle-nexus-plugin:2.3.1' - classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.21.1" + classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.22.0" classpath "gradle.plugin.se.bjurr.gitchangelog:git-changelog-gradle-plugin:1.64" } } plugins { id 'java' - id 'com.github.johnrengelman.shadow' version '5.1.0' + id 'com.github.johnrengelman.shadow' version '5.2.0' id 'eclipse' } @@ -71,21 +74,21 @@ repositories { maven { url "https://cfmlprojects.org/artifacts" } } dependencies { - compile group: 'com.github.cfparser', name: 'cfml.parsing', version: '2.11.0' - compile group: 'commons-cli', name: 'commons-cli', version: '1.2' - compile group: 'ro.fortsoft.pf4j', name: 'pf4j', version: '0.6' - compile group: 'ant', name: 'ant', version: '1.7.0' - compile group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.1.8' - compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.3' - compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-jaxb-annotations', version: '2.10.3' - compile(group: 'net.java.dev.stax-utils', name: 'stax-utils', version: '20070216') { + implementation group: 'com.github.cfparser', name: 'cfml.parsing', version: '2.11.0' + implementation group: 'commons-cli', name: 'commons-cli', version: '1.2' + implementation group: 'ro.fortsoft.pf4j', name: 'pf4j', version: '0.6' + implementation group: 'org.apache.ant', name: 'ant', version: '1.10.14' + implementation group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.1.17' + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.12.7' + implementation group: 'com.fasterxml.jackson.module', name: 'jackson-module-jaxb-annotations', version: '2.12.7' + implementation(group: 'net.java.dev.stax-utils', name: 'stax-utils', version: '20070216') { exclude module: 'jsr173-ri' exclude module: 'jsr173' } // https://mvnrepository.com/artifact/commons-io/commons-io - compile group: 'commons-io', name: 'commons-io', version: '2.5' + implementation group: 'commons-io', name: 'commons-io', version: '2.15.1' - testCompile group: 'junit', name: 'junit', version: '4.12' + testImplementation group: 'junit', name: 'junit', version: '4.13.2' } test { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 51288f9c2f05faf8d42e1a751a387ca7923882c3..62d4c053550b91381bbd28b1afc82d634bf73a8a 100644 GIT binary patch literal 58910 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 delta 49190 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 a>uzBD7C8nqNax?>K@w2Gz}mZifBQcLuBGq* diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ed24ffda2..53b9e3802 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Tue Sep 10 18:30:01 EDT 2019 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-bin.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4453ccea3..8b35b5b74 100755 --- a/gradlew +++ b/gradlew @@ -28,16 +28,16 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -66,6 +66,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -109,10 +110,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -138,35 +140,30 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Escape application args -save ( ) { +save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d6a..219d17f98 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,8 +13,11 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -65,6 +68,7 @@ set CMD_LINE_ARGS=%* set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% diff --git a/pom.xml b/pom.xml index ec0a27374..e837e7f37 100644 --- a/pom.xml +++ b/pom.xml @@ -43,24 +43,24 @@ - - cfmlprojects - cfmlprojects - https://cfmlprojects.org/artifacts - - - sonatype - sonatype - https://oss.sonatype.org/content/repositories/releases - - + + cfmlprojects + cfmlprojects + http://cfmlprojects.org/artifacts + + + sonatype + sonatype + https://oss.sonatype.org/content/repositories/releases + + - - The New BSD License - https://opensource.org/licenses/bsd-license.html - repo - + + The New BSD License + http://www.opensource.org/licenses/bsd-license.html + repo + @@ -70,7 +70,7 @@ 1.8 2.11.0 - 2.10.3 + 2.12.7.1 1.7.21 @@ -93,12 +93,12 @@ org.apache.ant ant - 1.7.0 + 1.10.14 com.sun.xml.bind jaxb-impl - 2.1.8 + 2.1.17 com.fasterxml.jackson.core @@ -121,12 +121,12 @@ 20070216 - jsr173-ri com.bea.xml + jsr173-ri - jsr173 javax.xml + jsr173 @@ -134,14 +134,14 @@ commons-io commons-io - 2.5 + 2.15.1 junit junit - 4.12 + 4.13.2 test @@ -188,24 +188,24 @@ - - org.apache.maven.plugins - maven-jar-plugin - - - - true - + + org.apache.maven.plugins + maven-jar-plugin + + + + true + CFLint - com.cflint.CFLint - CFLint - 2 - ${project.version} + com.cflint.CFLint + CFLint + 2 + ${project.version} - - - + + + maven-resources-plugin 2.6 @@ -251,36 +251,36 @@ - pl.project13.maven - git-commit-id-plugin - 2.2.2 - - - validate - - revision - - - - - yyyyMMdd-HHmmss - ${project.basedir}/.git - ${project.build.outputDirectory}/git.properties - true - false - false - - + pl.project13.maven + git-commit-id-plugin + 2.2.2 + + + validate + + revision + + + + + yyyyMMdd-HHmmss + ${project.basedir}/.git + ${project.build.outputDirectory}/git.properties + true + false + false + + - org.apache.maven.plugins - maven-surefire-plugin - 2.18.1 - - 1 - true - -Xmx2g - - + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + 1 + true + -Xmx2g + + @@ -301,7 +301,7 @@ deploy - + org.apache.maven.plugins maven-source-plugin diff --git a/src/main/java/com/cflint/cli/CFLintCLI.java b/src/main/java/com/cflint/cli/CFLintCLI.java index afa0aece9..0d1607464 100644 --- a/src/main/java/com/cflint/cli/CFLintCLI.java +++ b/src/main/java/com/cflint/cli/CFLintCLI.java @@ -226,9 +226,9 @@ public static void main(final String[] args) throws Exception { final CFLintPluginInfo pluginInfo = ConfigUtils.loadDefaultPluginInfo(); final ConfigBuilder configBuilder = new ConfigBuilder(pluginInfo); if (cmd.hasOption(Settings.MARKDOWN)){ - final FileWriter out = new FileWriter("RULES.MD"); + final FileWriter out = new FileWriter("RULES.md"); CFLintDoc.generateRuleMarkDown(pluginInfo, new PrintWriter(out)); - System.out.println("Rules written to RULES.MD"); + System.out.println("Rules written to RULES.md"); out.close(); return; } diff --git a/src/main/java/com/cflint/tools/CFLintDoc.java b/src/main/java/com/cflint/tools/CFLintDoc.java index 97f795980..b910cbf2c 100644 --- a/src/main/java/com/cflint/tools/CFLintDoc.java +++ b/src/main/java/com/cflint/tools/CFLintDoc.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.Map; -import com.cflint.config.CFLintConfiguration; import com.cflint.config.CFLintPluginInfo; import com.cflint.config.ConfigUtils; import com.cflint.config.CFLintPluginInfo.PluginInfoRule; @@ -37,50 +36,56 @@ public static void generateRuleGroup(final CFLintPluginInfo pluginInfo, final Pr } } } - + public static void generateRuleMarkDown(final CFLintPluginInfo pluginInfo, final PrintWriter print){ final Map descriptions = ConfigUtils.loadDescriptions(); - final List diminishParms = Arrays.asList("UnusedLocalVarChecker","CFXTagChecker","FunctionXChecker"); - print.println("List of built-in rules and rule groups"); - print.println("======================================"); - print.println("## Rule Parameters "); - for(PluginInfoRule ruleInfo: pluginInfo.getRules()){ - //Do not highlight specific parameters. - if(!diminishParms.contains(ruleInfo.getClassName())){ - for(PluginParameter p: ruleInfo.getParameters()){ - print.println("
" + ruleInfo.getName()+"." + p.getName() + " = *" + p.getValue() + "*"); + final List diminishParams = Arrays.asList("UnusedLocalVarChecker","CFXTagChecker","FunctionXChecker"); + print.println("# Built-in Rules"); + print.println(""); + print.println("## Rule List"); + + for (PluginInfoRule ruleInfo: pluginInfo.getRules()) { + print.println(""); + print.println("### " + ruleInfo.getName()); + + for (PluginMessage msg: ruleInfo.getMessages()) { + final String desc = descriptions.get(msg.getCode()) != null ? + descriptions.get(msg.getCode()).replace(">", ">").replace("<", "<") : ""; + print.println(""); + print.println("#### "+ msg.getCode()); + if (desc.length() > 0) { + print.println(""); + print.println(desc); } - } - } - print.println("## Built-in rules"); - - for(PluginInfoRule ruleInfo: pluginInfo.getRules()){ - print.println("* "+ ruleInfo.getName()); - final String className = ruleInfo.getClassName()==null?ruleInfo.getName():ruleInfo.getClassName(); - final String fullClassName = className.contains(".")?className: - "com.cflint.plugins.core." + className; - //print.println("**Class:** "+fullClassName); - if(!ruleInfo.getParameters().isEmpty()){ - print.println(" * Parameters"); - for(PluginParameter p: ruleInfo.getParameters()){ - print.println(" * " + p.getName() + " = *" + p.getValue() + "*"); + if (msg.getSeverity().toString().length() > 0) { + print.println(""); + print.println("**Severity**: " + msg.getSeverity()); + } + final String messageText = cleanUpMessage(msg,ruleInfo); + if (messageText.length() > 0) { + print.println(""); + print.println("**Message**: " + messageText); } } - int counter = 1; - for(PluginMessage msg: ruleInfo.getMessages()){ - final String desc = descriptions.get(msg.getCode())!=null? - descriptions.get(msg.getCode()).replace(">", ">").replace("<", "<"):""; - print.println(" * "+ msg.getCode() + " - " + desc+ " *" + msg.getSeverity() + "*"); - print.println(" * "+ cleanUpMessage(msg,ruleInfo) ); + + if (!ruleInfo.getParameters().isEmpty() && !diminishParams.contains(ruleInfo.getClassName())) { + print.println(""); + print.println("#### " + ruleInfo.getName() + " Parameters"); + for (PluginParameter p: ruleInfo.getParameters()) { + print.println(""); + print.println("* " + p.getName() + " = *" + p.getValue() + "*"); + } } } - + + print.println(""); print.println("## Rule Groups"); - for (final RuleGroup ruleGroup : pluginInfo.getRuleGroups()) { + print.println(""); print.println("### " + ruleGroup.getName()); for (final PluginMessage msg : ruleGroup.getMessages()) { - print.println(" * " + msg.getCode() + " *" + msg.getSeverity() + "*"); + print.println(""); + print.println("* [" + msg.getCode() + "](#" + msg.getCode().toLowerCase() + ")"); } } } diff --git a/src/main/resources/cflint.description.txt b/src/main/resources/cflint.description.txt index afe2d8eac..cbcdd7c7d 100644 --- a/src/main/resources/cflint.description.txt +++ b/src/main/resources/cflint.description.txt @@ -3,11 +3,11 @@ ARG_VAR_CONFLICT:Variable declared in both local and argument scopes. ARG_VAR_MIXED:Variable referenced in local and argument scopes. NO_DEFAULT_INSIDE_SWITCH:Missing default switch statement. GLOBAL_VAR:Global variable exists. -NESTED_CFOUTPUT:Nexted cfoutput with cfquery tag. +NESTED_CFOUTPUT:Nested cfoutput with cfquery tag. OUTPUT_ATTR:Tag should have output='false'. QUERYPARAM_REQ:Use query parameters for variables in sql statements. CFQUERYPARAM_REQ:cfquery should use . -QUERYNEW_DATATYPE:QueryNew statement should specify datatypes. +QUERYNEW_DATATYPE:QueryNew statement should specify data types. MISSING_VAR:Variable is not declared with a var statement. AVOID_USING_CFDUMP_TAG:Avoid use of cfdump tags. AVOID_USING_CFEXECUTE_TAG:Avoid use of cfexecute tags. @@ -29,46 +29,46 @@ FUNCTION_TYPE_ANY:Function has a return type of any. EXCESSIVE_ARGUMENTS:Function has too many arguments. EXCESSIVE_FUNCTIONS:Too many functions. FUNCTION_TOO_COMPLEX:Function is too complex. -AVOID_USING_WRITEDUMP:Avoid use of writedump statements. -AVOID_USING_STRUCTNEW:Avoid use of structnew statements. Use {} instead. -AVOID_USING_ISDEBUGMODE:Avoid use of isdebugmode statements. -AVOID_USING_ARRAYNEW:Avoid use of arraynew statements. Use [] instead. +AVOID_USING_WRITEDUMP:Avoid use of writeDump statements. +AVOID_USING_STRUCTNEW:Avoid use of structNew statements. Use {} instead. +AVOID_USING_ISDEBUGMODE:Avoid use of isDebugMode statements. +AVOID_USING_ARRAYNEW:Avoid use of arrayNew statements. Use [] instead. COMPLEX_BOOLEAN_CHECK:Complex boolean expression. EXPLICIT_BOOLEAN_CHECK:Checking boolean expression explicitly. VAR_INVALID_NAME:Variable has invalid name. -VAR_ALLCAPS_NAME:Variable name is allcaps. -SCOPE_ALLCAPS_NAME:Variable scope name is allcaps. +VAR_ALLCAPS_NAME:Variable name is all caps. +SCOPE_ALLCAPS_NAME:Variable scope name is all caps. VAR_TOO_SHORT:Variable name is too short. VAR_TOO_LONG:Variable name is too long. VAR_TOO_WORDY:Variable name contain too many words. VAR_IS_TEMPORARY:Variable name looks temporary. VAR_HAS_PREFIX_OR_POSTFIX:Variable name has prefix or postfix. ARGUMENT_INVALID_NAME:Argument has invalid name. -ARGUMENT_ALLCAPS_NAME:Argument name is allcaps. +ARGUMENT_ALLCAPS_NAME:Argument name is all caps. ARGUMENT_TOO_SHORT:Argument name is too short. ARGUMENT_TOO_LONG:Argument name is too long. ARGUMENT_TOO_WORDY:Argument name contain too many words. ARGUMENT_IS_TEMPORARY:Argument name looks temporary. ARGUMENT_HAS_PREFIX_OR_POSTFIX:Argument name has prefix or postfix. METHOD_INVALID_NAME:Method has invalid name. -METHOD_ALLCAPS_NAME:Method name is allcaps. +METHOD_ALLCAPS_NAME:Method name is all caps. METHOD_TOO_SHORT:Method name is too short. METHOD_TOO_LONG:Method name is too long. METHOD_TOO_WORDY:Method name contain too many words. METHOD_IS_TEMPORARY:Method name looks temporary. METHOD_HAS_PREFIX_OR_POSTFIX:Method name has prefix or postfix. COMPONENT_INVALID_NAME:Component has invalid name. -COMPONENT_ALLCAPS_NAME:Component name is allcaps. +COMPONENT_ALLCAPS_NAME:Component name is all caps. COMPONENT_TOO_SHORT:Component name is too short. COMPONENT_TOO_LONG:Component name is too long. COMPONENT_TOO_WORDY:Component name contain too many words. COMPONENT_IS_TEMPORARY:Component name looks temporary. COMPONENT_HAS_PREFIX_OR_POSTFIX:Component name has prefix or postfix. FILE_SHOULD_START_WITH_LOWERCASE:CFM File starts with upper case. -AVOID_USING_CREATEOBJECT:Avoid use of creatobject statements. +AVOID_USING_CREATEOBJECT:Avoid use of creatObject statements. AVOID_USING_DEBUG_ATTR:Avoid use of debug attribute. UNUSED_LOCAL_VARIABLE:Unused local variable. UNUSED_METHOD_ARGUMENT:Unused method argument. AVOID_USING_CFSETTING_DEBUG:Avoid using showDebugOutput attribute on cfsetting. -COMPARE_INSTEAD_OF_ASSIGN:Using comparision where assignment was probably meant. +COMPARE_INSTEAD_OF_ASSIGN:Using comparison where assignment was probably meant. PACKAGE_CASE_MISMATCH:Warn with package case does not match its use.