在平时写代码的时候,为了代码规范和减少 bug 的数量,使用 SonarLint 插件进行代码检查无疑是一个很好的方法。Sonar 是一个用于代码质量管理的开源平台,用来管理源代码的质量,通过插件的形式支持包括 Java、C++、C语言等多种编程语言的代码质量管理与检测。

Sonar 从以下七个维度来进行代码质量的检测:

  • 不遵循代码标准:Sonar 可以通过 PMD、CheckStyle、Findbugs 等代码规则检测工具来规范代码的编写
  • 潜在的缺陷:Sonar 可以通过 PMD、CheckStyle、Findbugs 等代码规则检测工具检测出代码中存在的潜在的缺陷,如 NullPointerException 等
  • 糟糕的复杂度分布:文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试
  • 重复:一般来说,程序中尽量避免大面积的重复代码,复制粘贴的代码是质量低下的,Sonar 可以显示源代码中重复较严重的地方
  • 注释不足或者过多:没有注释将使代码可读性变差,特别是当出现人事变动时,程序的可读性将大幅下降,而过多的注释又会使得开发人员过多地花费时间在阅读注释上
  • 缺乏单元测试:Sonar 可以很方便地统计和展示单元测试覆盖率
  • 糟糕的设计:通过 Sonar 可以找出循环、展示包与包、类与类之间的相互依赖关系,可以检测出自定义的架构规则,通过 Sonar 可以管理第三方的 jar 包,可以利用 LCOM4 检测单个任务规则的应用情况,检测耦合

 

Sonar 默认扫描规则(Java 版)如下:https://www.bbsmax.com/A/Vx5M2BGpdN/

在实际使用中,各个规则的等级以 SonarLint 插件的提示为准,一般建议底阿妈中不要出现 Block 和 Critical 级别的提示

Sonar 默认扫描规则

状态

规则

规则解释

禁用原因

等级

备注

启用

".equals()" should not be used to test the values of "Atomic" classes

equals() 方法不应该用在原子类型的数据上(如:AtomicInteger, AtomicLong, AtomicBoolean)

 

 

 

启用

"=+" should not be used instead of "+="

"=+"不可以替代"+="

 

 

 

启用

"==" and "!=" should not be used when "equals" is overridden

如果继承自对象的 equals method 没有被重写,则使用等号"=="操作符和 equals 方法来比较两个对象是等价的,否则不能用等号操作符

 

 

 

启用

"@CheckForNull" or "@Nullable" should not be used on primitive types

"@CheckForNull"或者"@Nullable"注解不应该用于基本类型(byte, short, int, long, float, double, boolean, char)

 

 

 

 

"@Controller" classes that use "@SessionAttributes" must call "setComplete" on their "SessionStatus" objects

使用了"@SessionAttributes"注解的"@Controller"类必须在其"SessionStatus"对象上调用"setComplete"

 

 

 

 

"@Deprecated" code should not be used

被 @Deprecated 注解标注的代码不应该被使用

 

 

 

 

"@EnableAutoConfiguration" should be fine-uned

"@EnableAutoConfiguration"缺点是它可能加载和配置应用程序永远不会使用的 bean,因此会消耗比实际需要更多的 CPU 和 RAM。@EnableAutoConfiguration 应该配置为排除应用程序不需要的所有 bean

 

 

 

 

"@Import"s should be preferred to "@ComponentScan"s

由于 @ComponentScan 会减慢项目启动的速度,应该选择显式引入 jar 包的"@Import"注解,而不是"@ComponentScan"注解

 

 

 

 

"@NonNull" values should not be set to null

@NonNull 注解修饰的字段不能被赋为 null, 标记为 @NotNull、@NonNull 或 @NonNull 的字段、参数和返回值通常在使用前不检查空值。将这些值中的一个设置为 null,或者在构造函数中没有设置这样的类 fieldin,可能会在运行时导致 NullPointerException

 

 

 

 

"@Override" should be used on overriding and implementing methods

在重写和实现方法时,需要添加"@Override"注解

 

 

 

 

"@RequestMapping" methods should be "public"

"@RequestMapping"注解应该用来修饰 public 方法/类

 

 

 

 

"@RequestMapping" methods should specify HTTP method

@RequestMapping 应该显式的指定 HTTP 请求的类型

 

 

 

 

"@SpringBootApplication" and "@ComponentScan" should not be used in the default package

"@SpringBootApplication"和"@ComponentScan"注解不应该在默认包中使用

 

 

 

 

"action" mappings should not have too many "forward" entries

action 映射不应该有太多的"forward"实体

 

 

 

 

"Arrays.stream" should be used for primitive arrays

流应该被用在基本类型数组上

 

 

 

 

"Bean Validation" (JSR 380) should be properly configured

"Bean Validation" (JSR 380)应该被正确的配置,未添加 @Valid 注解时,Bean Validation 校验将不会生效

 

 

 

 

"BigDecimal(double)" should not be used

由于精度的原因,BigDecimal(double) 类型不应该被使用,往往会使用 valueof() 方法将 double 类型数据进行转化

 

Major

 

 

"catch" clauses should do more than rethrow

catch 捕获到异常之后,不应该仅仅只是抛出异常

 

 

 

 

"Class.forName()" should not load JDBC 4.0+ drivers

"Class.forName()"不应该加载 JDBC 4.0+ 驱动程序

 

 

 

 

"clone" should not be overridden

clone() 方法不应该被重写,重写可能导致浅克隆的问题

 

 

 

 

"Cloneables" should implement "clone"

Cloneables 接口需要实现 clone() 方法

 

 

 

 

"close()" calls should not be redundant

不应该有多余的 close() 方法的调用

 

 

 

 

"collect" should be used with "Streams" instead of "list::add"

使用 Streams 时,应该用 collect,因为 collect 的进程是并行且安全的

 

 

 

 

"Collections.EMPTY_LIST", "EMPTY_MAP", and "EMPTY_SET" should not be used

因为"Collections.EMPTY_LIST", "EMPTY_MAP", and "EMPTY_SET"会返回默认的集合,会导致对于返回值判 null 的步骤缺失的问题,不推荐使用

 

 

 

 

"compareTo" results should not be checked for specific values

"compareTo"结果不应检查特定值,通常检查 >0 或者 <0

 

 

 

 

"compareTo" should not be overloaded

compareTo 参数个数不应该超出声明的个数

 

 

 

 

"compareTo" should not return "Integer.MIN_VALUE"

compareTo 的返回值不能是 Integer.MIN_VALUE

 

 

 

 

"DateUtils.truncate" from Apache Commons Lang library should not be used

Apache Commons Lang 的日期截取方法 DateUtils.truncate() 不会四舍五入,不应该被使用

 

 

 

 

"default" clauses should be last

switch中 default 应该被放在最后

 

 

 

 

"DefaultMessageListenerContainer" instances should not drop messages during restarts

DefaultMessageListenerContainer 实例不应该在重启期间删除消息

 

 

 

 

"deleteOnExit" should not be used

java 程序执行结束后,有自己的回收机制,不需要用 deleteOnExit 回收临时文件

 

 

 

 

"Double.longBitsToDouble" should not be used for "int"

int 类型的数据转换为 lone double 会存在精度问题,不应该这样使用

 

 

 

 

"entrySet()" should be iterated when both the key and value are needed

在需要获取 map 中的键值对 key 和 value 时,应该用 entryset() 方法

 

 

 

 

"enum" fields should not be publicly mutable

集合类型的值不应该是可变的

 

 

 

 

"equals" method overrides should accept "Object" parameters

重载的 equals 方法,应该能接受 object 类型的参数

 

 

 

 

"equals" method parameters should not be marked "@Nonnull"

equals 方法的参数不应该被 @Nonnull 注解修饰,equals() 方法可以接受为 null 的数据

 

 

 

 

"equals" methods should be symmetric and work for subclasses

equals 方法可以应用于子类,因为"=="操作符需要保证两端数据的对称性,但父类不是子类的实例

 

 

 

 

"equals(Object obj)" and "hashCode()" should be overridden in pairs

equals(Object obj) 和 hashCode() 应该成对出现

 

 

 

 

"equals(Object obj)" should be overridden along with the "compareTo(T obj)" method

equals(Object obj) 和 compareTo(T obj) 应该一起重写

 

 

 

 

"equals(Object obj)" should test argument type

因为 equals 方法能接受泛型参数,所以需要对于传递的参数类型进行验证

 

 

 

禁用

"Exception" should not be caught when not required by called methods

当调用的方法不需要捕获异常时,不应该捕获到异常(主要针对于运行时异常和检查异常)

运行时如果异常应该能正常捕获到,并提醒开发人员调整

 

 

 

"Externalizable" classes should have no-arguments constructors

Externalizable 类需要有无参构造函数

 

 

 

 

"File.createTempFile" should not be used to create a directory

File.createTempFile 不够安全,不应该用于创建新的目录

 

 

 

 

"final" classes should not have "protected" members

final 类是不可被继承的,不应该有 protected 类型的元素

 

 

 

 

"finalize" should not set fields to "null"

finalize 修饰的空间不应该被置为 null

 

 

 

 

"for" loop increment clauses should modify the loops' counters

循环增量子句应该修改计数器

 

 

 

 

"for" loop stop conditions should be invariant

循环停止的条件应该是不可变的

 

 

 

 

"getClass" should not be used for synchronization

getClass() 方法不应该被用在 synchronization 修饰的方法中

 

 

 

 

"hashCode" and "toString" should not be called on array instances

array 实例中不应该使用 hashCode 和 toString 方法

 

 

 

 

"HostnameVerifier.verify" should not always return true

HostnameVerifier.verify 不应该一直返回 true

 

 

 

 

"HttpOnly" should be set on cookies

应该在 cookies 中设置 HttpOnly 属性,可以有效地防止XSS攻击

 

 

 

 

"HttpSecurity" URL patterns should be correctly ordered

用 HttpSecurity 方法配置 url 应该按照一定的声明顺序

 

 

 

 

"HttpServletRequest.getRequestedSessionId()" should not be used

不应该使用 HttpServletRequest.getRequestedSessionId() 方法获取 sessionId

 

 

 

 

"if ... else if" constructs should end with "else" clauses

if ... else if 结构应该以 else 语句结束

 

 

 

 

"indexOf" checks should not be for positive numbers

indexOf() 方法结果判断不应该仅针对于正数

 

Critical

 

 

"indexOf" checks should use a start position

indexOfF 方法应该传入起始地址参数

 

 

 

 

"instanceof" operators that always return "true" or "false" should be removed

如果 instanceof 操作符的结果一直返回 true 或者 false,那么相关的调用语句应该被删除

 

 

 

 

"Integer.toHexString" should not be used to build hexadecimal strings

Integer.toHexString 方法不应该用于构建16进制字符串

 

 

 

 

"InterruptedException" should not be ignored

不应该忽略 InterruptedException(方法阻塞)报错

 

 

 

 

"iterator" should not return "this"

iterator() 方法不应该返回 this

 

 

 

 

"Iterator.hasNext()" should not call "Iterator.next()"

Iterator.hasNext() 是判断是否有下一个元素,但并不会改变指针指向,而 next() 会改变指针指向,如果没有下一个元素,会直接报空指针异常

 

 

 

 

"Iterator.next()" methods should throw "NoSuchElementException"

Iterator.next() 方法应该抛出 NoSuchElementException 异常

 

 

 

 

"java.lang.Error" should not be extended

java.lang.Error 不应该被继承

 

 

 

 

"java.nio.Files#delete" should be preferred

因为 java.nio.Files#delete 会抛异常并说明异常的原因,所以在删除文件时应优先考虑 java.nio.Files#delete 方法

 

 

 

 

"java.time" classes should be used for dates and times

获取日期或者时间,应该使用 java.time 方法

 

 

 

 

"javax.crypto.NullCipher" should not be used for anything other than testing

javax.crypto.NullCipher 应该只用于测试

 

 

 

 

"Lock" objects should not be "synchronized"

被锁定的对象不应该被 synchronized 修饰

 

 

 

 

"main" should not "throw" anything

main 方法不应该抛出任何异常

 

 

 

 

"Map.get" and value test should be replaced with single method call

需要同时获取 map 的键值对时,应该使用单个的获取方法

 

 

 

 

"notifyAll" should be used

应该使用 notifyAll() 方法唤醒所有休眠的进程

 

 

 

 

"null" should not be used with "Optional"

Optional 修饰的对象不应该被赋值为 null

 

 

 

 

"Object.finalize()" should remain protected (versus public) when overriding

Object.finalize() 方法应该只有垃圾回收器才可以调用

 

 

 

 

"Object.wait(...)" and "Condition.await(...)" should be called inside a "while" loop

Object.wait(…)和 condition .wait(…) 应该在 while 循环中调用

 

 

 

 

"Object.wait(...)" should never be called on objects that implement

"java.util.concurrent.locks.Condition"实现"java.util.concurrent.locks.Condition"的对象不应该调用"Object.wait(…)"方法

 

 

 

 

"Preconditions" and logging arguments should not require evaluation

先决条件和日志参数不应该需要计算,换言之,在调用"Preconditions"和 logging() 方法时,参数应该是可确定的

 

 

 

 

"PreparedStatement" and "ResultSet" methods should be called with valid indices

应该使用有效的索引(>0)调用"PreparedStatement"和"ResultSet"方法,因为"PreparedStatement"和"ResultSet"方法的索引都是从1开始

 

 

 

 

"private" methods called only by inner classes should be moved to those classes

只由内部类调用的私有方法应该放到这些类里

 

 

 

 

"public static" fields should be constant

公共静态字段应该是常量

 

 

 

禁用

"Random" objects should be reused

应该重用随机对象

随机数种子在创建一个 random 对象的时候生成,相同的随机数种子,产生相同随机数的几率非常高

 

 

 

"read" and "readLine" return values should be used

"read" 和 "readLine"返回值应该被使用

 

 

 

 

"read(byte[],int,int)" should be overridden

read(byte[],int,int) 方法应该被重载

 

 

 

 

"readObject" should not be "synchronized"

readObject 方法不应该被同步修饰符(synchronized)修饰

 

 

 

 

"readResolve" methods should be inheritable

"readResolve"方法应该是可继承的,因为 readResolve() 允许在反序列化期间对于对象的状态进行微调

 

 

 

 

"ResultSet.isLast()" should not be used

不应该使用"ResultSet.isLast()"方法,因为 .isLast() 方法会将指针的指向移动到下一个元素上,从而可能导致空指针,而 .next() 方法则是先判断下一个元素是否存在

 

 

 

 

"runFinalizersOnExit" should not be called

不应该调用"runFinalizersOnExit",因为 runFinalizersOnExit() 方法可能导致正在被其他进程调用的对象被终止,是不安全的

 

 

 

 

"ScheduledThreadPoolExecutor" should not have 0 core threads

ScheduledThreadPoolExecutor(任务调度进程池)的大小和 corePoolSize 的一致,所以核心进程的个数不能为0

 

 

 

 

"SecureRandom" seeds should not be predictable

安全随机数种子不应该是可预测的

 

 

 

 

"Serializable" inner classes of non-serializable classes should be "static"

序列化/反序列化方法应该是被 static 修饰符修饰的

 

 

 

 

"SingleConnectionFactory" instances should be set to "reconnectOnException"

"SingleConnectionFactory"实例应该设置为"reconnectOnException",因为在不启用 reconnectOnException 设置的情况下使用 SingleConnectionFactory 将在连接出错时无法自动恢复连接

 

 

 

 

"StandardCharsets" constants should be preferred

应该首先考虑标准字符集(ISO_8859_1、US_ASCII、UTF_16 、UTF_16BE 、UTF_16LE 、UTF_8)

 

 

 

 

"static" members should be accessed statically

静态常量应该被静态访问

 

 

 

 

"Stream" call chains should be simplified when possible

流的方法调用应当尽可能的简洁

 

 

 

 

"Stream.peek" should be used with caution

.peek() 方法主要用于 debug,而且仅在对流内元素进行操作时,peek() 才会被调用,所以在使用时需要谨慎

 

 

 

 

"StringBuilder" and "StringBuffer" should not be instantiated with a character

"StringBuilder"和"StringBuffer"不应该被单个字符实例化

 

 

 

 

"super.finalize()" should be called at the end of "Object.finalize()" implementations

super.finalize() 应该在 Object.finalize() 方法中最后一行被调用,防止系统资源冲突

 

 

 

 

"switch" statements should have "default" clauses

switch() 方法中需要用 default 子句,控制除了 case 以外的其他场景

 

 

 

 

"switch" statements should have at least 3 "case" clauses

switch() 方法至少需要有3个 case 子句,case 子句 <=2 的场景,用 if...else 即可

 

 

 

 

"switch" statements should not contain non-case labels

switch 语句不应该包含无 case 关键字的列举情况

 

 

 

 

"switch" statements should not have too many "case" clauses

switch 语句不应该包含太多(>30)的 case 子句,子句太多时,用 map 的性能会更高

 

 

 

 

"Thread.run()" should not be called directly

Thread.run() 方法不应该被直接调用,因为 Thread.run() 方法会导致代码在当前进程中被执行

 

 

 

 

"Thread.sleep" should not be used in tests

Thread.sleep() 方法不应该在测试过程中被调用

 

 

 

 

"ThreadGroup" should not be used

ThreadGroup() 不应该被调用

 

 

 

 

"ThreadLocal.withInitial" should be preferred

应优先考虑 ThreadLocal.withInitial() 方法

 

 

 

 

"Threads" should not be used where "Runnables" are expected

线程不应该使用在预期可运行项的地方

 

 

 

 

"throws" declarations should not be superfluous

throws 声明不应该抛出多个异常

 

 

 

 

"toArray" should be passed an array of the proper type

在没有参数的情况下,.toArray() 方法将会返回一个 object,若用 .toArray() 方法来转换固定类型的数组,需要将正确类型的参数传入

 

 

 

 

"toString()" and "clone()" methods should not return null

toString() 和 clone() 方法,不应该返回 null

 

 

 

 

"toString()" should never be called on a String object

在 String 对象上不应该调用 toString() 方法

 

 

 

 

"URL.hashCode" and "URL.equals" should be avoided

url 的 equals 和 hashCode 方法都可能触发名称服务(通常是DNS)查找来解析主机名或 IP 地址。根据配置和网络状态,这可能需要很长时间,应该避免调用 "URL.hashCode" 和 "URL.equals"

 

 

 

 

"volatile" variables should not be used with compound operators

对被 volatile 修饰的变量不应该进行复合型操作符运 算(应该只进行原子运算)

 

 

 

 

"wait" should not be called when multiple locks are held

当持有多个锁时,不应调用"wait"

 

 

 

 

"wait", "notify" and "notifyAll" should only be called when a lock is obviously held on an object

"wait"、"notify"和"notifyAll"只应在对象上明显持有锁时(如被synchronized修饰)调用

 

 

 

 

"wait(...)" should be used instead of "Thread.sleep(...)" when a lock is held

如果在当前线程持有锁时调用 thread .sleep(…),可能会导致性能和可伸缩性问题,或者更糟的情况是死锁。所以当锁被持有时,应该使用"wait(…)"而不是"Thread.sleep(…)"方法

 

 

 

 

"write(byte[],int,int)" should be overridden

当直接子类化 java.io.OutputStream 或者 java.io.FilterOutputStream 时,因为不能每次传递一个 byte 的数据,"write(byte[],int,int)"方法应该被重写

 

 

 

 

"writeObject" should not be the only "synchronized" code in a class

"writeObject"不应该是类中唯一的"synchronized"修饰符修饰的方法

 

 

 

 

A "for" loop update clause should move the counter in the right direction

for 循环更新子句应该将计数器移动到正确的方向

 

 

 

 

A "while" loop should be used instead of a "for" loop

当 for 循环中只定义了条件表达式,并且缺少初始化和增量表达式时,应该使用while循环来增加可读性

 

 

 

 

A conditionally executed single line should be denoted by indentation

有 if 条件执行的单行应该用缩进表示(未添加{}时)

 

 

 

 

A field should not duplicate the name of its containing class

字段不应重复其包含的类的名称

 

 

 

禁用

Abstract classes without fields should be converted to interfaces

没有字段的抽象类应该转换为接口

接口是为了暴露给外部,内部抽象类被继承即可

 

 

 

Abstract methods should not be redundant

抽象方法不应该是多余的

 

 

 

 

Accessing Android external storage is security-sensitive

访问 Android 外部存储是安全敏感的

 

 

 

 

AES encryption algorithm should be used with secured mode

AES 加密算法应采用安全模式(ECB 模式并不安全,不建议用 ECB 进行组合)

 

 

 

 

All branches in a conditional structure should not have exactly the same implementation

条件结构(if...else/switch等)中不建议有相同操作的分支

 

 

 

 

An iteration on a Collection should be performed on the type handled by the Collection

对集合的迭代应该是对集合所处理的类型执行

 

 

 

 

Annotation repetitions should not be wrapped

不应该重复包装注解

 

 

 

 

Anonymous inner classes containing only one method should become lambdas

只包含一个方法的匿名内部类应该成为 lambdas

 

 

 

 

Array designators "[]" should be located after the type in method signatures

数组指示符"[]"应该位于方法签名中的类型之后

 

 

 

 

Array designators "[]" should be on the type, not the variable

数组指示符"[]"应该位于类型后,而不是变量后

 

 

 

 

Arrays should not be created for varargs parameters

不应该为不定长参数参数创建数组

 

 

 

 

Assertion arguments should be passed in the correct order

应该按照正确的顺序传递断言参数

 

 

 

 

Assertions should be complete

断言应该是完整的

 

 

 

 

Asserts should not be used to check the parameters of a public method

断言不应用于检查公共方法的参数

 

 

 

 

Assignments should not be made from within sub-expressions

不应该在子表达式中进行赋值

 

 

 

 

Assignments should not be redundant

任务不应该是多余的

 

 

 

 

Authentication should not rely on insecure "PasswordEncoder"

身份验证不应该依赖于不安全的密码编码器

 

 

 

禁用

Basic authentication should not be used

不应该使用 Basic 身份认证方式

Basic 身份认证方式是当前最常用的方式,Base64 编码加密后,配合 username+password 可以满足通常的需求

 

 

 

Blocks should be synchronized on "private final" fields

块应该在"private final"修饰的字段上同步

 

 

 

 

Boolean checks should not be inverted

不应该使用反转布尔操作

 

 

 

 

Boolean expressions should not be gratuitous

布尔表达式不应该是完全不变的(应该有改变其值的操作)

 

 

 

 

Boolean literals should not be redundant

不应该进行无意义的布尔计算(如表达式和 true/false 判等、表达式反转等)

 

 

 

 

Boxing and unboxing should not be immediately reversed

装箱(创建 int/Integer 类型值的对象)和拆箱(将对象中原始值解出来)不应连续操作

 

 

 

 

Broadcasting intents is security-sensitive

广播意图是不安全的

 

 

 

 

Case insensitive string comparisons should be made without intermediate upper or lower casing

不区分大小写的字符串比较应该在没有中间大小写转化的情况下进行

 

 

 

 

Catches should be combined

相同代码块的 Catches 异常操作应该合并

 

 

 

 

Changing or bypassing accessibility is security-sensitive

更改或绕过可访问性检查是不安全的

 

 

 

 

Child class fields should not shadow parent class fields

子类不应该有和父类的字段名相同的字段

 

 

 

 

Child class methods named for parent class methods should be overrides

子类中重写的与父类方法命名一致的方法,static 修饰符等也要和父类保持一致

 

 

 

 

Class names should comply with a naming convention

类名应该符合命名约定

 

 

 

 

Class names should not shadow interfaces or superclasses

类名不应和他实现的接口或父类命名相同

 

 

 

 

Class variable fields should not have public accessibility

类变量字段应该是私有的

 

 

 

 

Classes extending java.lang.Thread should override the "run" method

扩展的 java.lang 线程应该是有重载的 run() 方法

 

 

 

 

Classes from "sun.*" packages should not be used

"sun.*" packages 不应该被使用,几乎总是有应该使用的 Java API 类包装

 

 

 

 

Classes named like "Exception" should extend "Exception" or a subclass

像"Exception"这样命名的类应该继承了"Exception"或其子类,否则不符合清晰、交流式的命名规范

 

 

 

 

Classes should not access their own subclasses during initialization

类在初始化期间不应该访问它们自己的子类

 

 

 

 

Classes should not be compared by name

类不应该按名称进行比较

 

 

 

 

Classes should not be empty

类不应该是空的

 

 

 

 

Classes that override "clone" should be "Cloneable" and call "super.clone()"

重载了 clone() 方法的类应该是实现 Cloneable 接口的,并且调用了 super.clone() 方法

 

 

 

 

Classes with only "static" methods should not be instantiated

只有静态方法的类不应该被实例化

 

 

 

 

Cognitive Complexity of methods should not be too high

方法的功能复杂度不应过高

 

Critical

 

 

Collapsible "if" statements should be merged

应该合并无需分层的"if"语句

 

Major

 

 

Collection sizes and array length comparisons should make sense

集合大小和数组长度比较应该是有意义的

 

 

 

 

Collection.isEmpty() should be used to test for emptiness

应该使用 Collection.isEmpty() 来判断是否为空

 

 

 

 

Collections should not be passed as arguments to their own methods

集合不应该作为参数传递给它们自己的方法

 

 

 

 

Composed "@RequestMapping" variants should be preferred

应该首选组合的"@RequestMapping"变体(@GetMapping、@PostMapping)

 

 

 

 

Conditionally executed blocks should be reachable

条件执行的块应该都是可以访问(不能导致死锁)

 

 

 

 

Conditionals should start on new lines

条件句应该从新行开始(if...else.../if..else if.../if...)

 

 

 

禁用

Configuring loggers is security-sensitive

配置日志记录器是不安全的

配置日志记录器是不安全的

 

 

 

Constant names should comply with a naming convention

常量名称应该符合命名约定

 

 

 

 

Constants should not be defined in interfaces

常量不应该在接口中定义

 

 

 

 

Constructors should not be used to instantiate "String", "BigInteger", "BigDecimal" and primitive-wrapper classes

构造函数不应该用于实例化"String"、"BigInteger"、"BigDecimal"和原子类包装

 

 

 

 

Consumed Stream pipelines should not be reused

使用的流管道不应重用

 

 

 

禁用

Controlling permissions is security-sensitive

权限控制是不安全的

有权限划分控制,才能满足不同的用户权限的不同,从而抵御黑客攻击

 

 

 

Cookie domains should be as narrow as possible

Cookie 域设置应该尽可能的详细

 

 

 

 

Creating cookies without the "secure" flag is security-sensitive

创建没有"secure"标志的 cookie 是不安全的

 

 

 

 

Credentials should not be hard-coded

凭证不应该直接赋值(需要通过调用方法等方式去获取)

 

 

 

 

Cryptographic keys should not be too short

秘钥不应该太短(对于Blowfish算法,密钥至少128位长,对于RSA算法,密钥至少2048位长。)

 

 

 

 

Cryptographic RSA algorithms should always incorporate OAEP (Optimal Asymmetric Encryption Padding)

密码 RSA 算法应该始终包含 OAEP(最佳非对称加密填充)

 

 

 

 

Custom serialization method signatures should meet requirements

自定义序列化方法签名应满足要求(作用域的限制等)

 

 

 

 

Databases should be password-protected

数据库应该有密码保护

 

 

 

 

Dead stores should be removed

死存储的变量代码应该被移除

 

 

 

 

Declarations should use Java collection interfaces such as "List" rather than specific implementation classes such as "LinkedList"

类中字段声明应该使用 Java 集合接口,如"List"、"Set"

 

 

 

 

Default EJB interceptors should be declared in "ejb-jar.xml"

缺省 EJB 拦截器应该在 EJB-jar.xml 中声明。

 

 

 

 

Defined filters should be used

已定义的过滤器应该被调用

 

 

 

 

Delivering code in production with debug features activated is security-sensitive

在生产环境中交付被激活的调试特性的代码是不安全的

 

 

 

 

Dependencies should not have "system" scope

依赖声明中不应该包含 system scope

 

 

 

 

Deprecated "${pom}" properties should not be used

弃用的 ${pom} 特性不应该再被使用

 

 

 

 

Deprecated code should be removed

弃用的代码应该被删除

 

 

 

 

Deprecated elements should have both the annotation and the Javadoc tag

被弃用的代码块应该添加 @Deprecated 注解以及标签

 

 

 

 

Deserializing objects from an untrusted source is security-sensitive

从不可信源反序列化对象是不安全的

 

 

 

 

Deserializing with XMLDecoder is security-sensitive

反序列化 XMLDecoder 对象是不安全的

 

 

 

 

Disabling Spring Security's CSRF protection is security-sensitive

禁用 spring 的跨域资源共享(CSRF)保护是不安全的

 

 

 

 

Dissimilar primitive wrappers should not be used with the ternary operator without explicit casting

在没有显式强制转换的情况下,不应该将不同的基本类型与三元运算符一起使用

 

 

 

 

Double Brace Initialization should not be used

不应该使用双花括号初始化

 

 

 

 

Double-checked locking should not be used

不应该使用双重检查锁定

 

 

 

 

Empty arrays and collections should be returned instead of null

需要返回数组/集合的方法,应该返回空数组/集合,而不是 null

 

 

 

 

Empty statements should be removed

应该删除空语句

 

 

 

禁用

Enabling Cross-Origin Resource Sharing is security-sensitive

启用跨域资源共享是不安全的

 

 

 

 

Encrypting data is security-sensitive

(不具备随机性的)加密数据是不安全的

 

 

 

 

Enumeration should not be implemented

枚举不应该像其他接口一样被实现,而复制后的迭代器是可以被实现的

 

 

 

 

Exception classes should be immutable

异常类应该是不可变的

 

 

 

 

Exception should not be created without being thrown

创建的异常应该被抛出

 

 

 

 

Exception types should not be tested using "instanceof" in catch blocks

不应该在 catch 代码块中用instanceof 对异常的类型进行判断处理

 

 

 

禁用

Exceptions should be either logged or rethrown but not both

异常应该被记录或者抛出,但不能同时被记录和抛出

存在通过日志将异常打印,同时让异常被其他的进行捕获的场景

 

 

 

Exceptions should not be thrown from servlet methods

不应该从 servlet 方法中抛出异常

 

 

 

 

Exceptions should not be thrown in finally blocks

不应该在 finally 中抛出异常

 

 

 

 

Execution of the Garbage Collector should be triggered only by the JVM

垃圾回收器只能由 JVM 触发

 

 

 

 

Expanding archive files is security-sensitive

展开归档文档是不安全的(应该验证归档文件展开的路径;不应展开到可以展开存档文件的根目录之外;应用程序应该控制扩展数据的大小,以避免成为 Zip 炸弹攻击的受害者)

 

 

 

 

Expressions used in "assert" should not produce side effects

“断言”中使用的表达式不应该需要计算(由于 assert 语句在默认情况下不被执行(断言必须使用 JVM 标志启用),永远不应该依赖于他们的解决方案来评估正确程序功能所需的任何逻辑。)

 

 

 

 

Factory method injection should be used in "@Configuration" classes

当在 @Configuration 修饰的类中使用 @Autowired 时,依赖关系需要在类实例化前得到解决,这可能会导致 bean 的早期初始化出问题,或者导致上下文查找不应该找到 bean 的位置。为了避免这个棘手的问题并优化上下文加载的方式,应该尽可能晚地请求依赖项。这意味着对于仅在单个 @Bean 方法中使用的依赖项,使用参数注入而不是字段注入

 

 

 

 

Field names should comply with a naming convention

字段名应该符合命名约定(正则表达式)

 

 

 

 

Fields in a "Serializable" class should either be transient or serializable

可序列化类中的字段应该是可转换的或可序列化的

 

 

 

 

Fields in non-serializable classes should not be "transient"

不可序列化的类中的字段不应该被"transient"关键字修饰

 

 

 

 

Files opened in append mode should not be used with ObjectOutputStream

在 append 模式下打开的文件不应该和 ObjectOutputStream一起使用

 

 

 

 

Formatting SQL queries is security-sensitive

格式化 SQL 查询是不安全的

 

 

 

 

Future keywords should not be used as names

关键字不应该用作名称,可能无法被解析

 

 

 

 

Generic exceptions should never be thrown

永远不应该抛出泛型异常

 

 

 

禁用

Generic wildcard types should not be used in return parameters

方法返回的参数类型不应该是泛型

可以对于子类继承的父类A和子类A1本身进行相同的操作,但是返回的类型不同,此处需要返回参数为泛型

 

 

 

Getters and setters should access the expected fields

getter 和 setter 方法应该访问预期的字段

 

 

 

 

Getters and setters should be synchronized in pairs

getter 和 setter 应该成对同步

 

 

 

 

Hashing data is security-sensitive

哈希数据是不安全的(为了安全目的,只使用目前已知较强的哈希算法。完全避免在安全上下文中使用 MD5 和 SHA1 之类的算法。)

 

 

 

 

Hibernate should not update database schemas

Hibernate 不应该更新数据库模式(hibernate.hbm2ddl.auto 只有在 validate 时才可以使用,否则可能导致数据库的模式被更改)

 

 

 

 

Identical expressions should not be used on both sides of a binary operator

不应该在二元操作符的两边使用相同的表达式

 

 

 

 

IllegalMonitorStateException should not be caught

不应该捕获非法的 MonitorStateException 异常

 

 

 

 

Inappropriate "Collection" calls should not be made

不应该做不合适的 Collection 方法调用(当提供给 Collection.remove() / Collection.contains() 方法的对象的实际类型与集合实例化的 declaredon 类型不一致时,这些方法总是返回 false 或 null)

 

 

 

 

Inappropriate regular expressions should not be used

不应该使用不合适的正则表达式

 

 

 

 

Inheritance tree of classes should not be too deep

类的继承树不应该太深(限制5层)

 

 

 

 

Inner class calls to super class methods should be unambiguous

对超类方法的内部类的调用应该是明确的

 

 

 

 

InputSteam.read() implementation should not return a signed byte

InputSteam.read() 的实现不应该返回带符号的字节(java 文档注明,InputSteam.read() 方法的值字节必须是0到255范围内的整数。如果由于到达了流的末尾而没有可用的字节,则返回值启用1。)

 

 

 

 

Instance methods should not write to "static" fields

"static"字段不应该在实例方法中处理

 

 

 

 

Interface names should comply with a naming convention

接口的命名应该符合命名规范

 

 

 

 

Intermediate Stream methods should not be left unused

中间流方法不应该闲置,应该提供对应的终端操作(流操作有两种类型:中间操作(返回另一个流)和终端操作(返回比流更多的内容)。中间操作是惰性的,如果中间流操作的结果没有提供给终端操作,那么它就没有任何作用)

 

 

 

 

Ints and longs should not be shifted by zero or more than their number of bits-1

int 和 long 类型数据的位移不应该 > 或者等于0

 

 

 

 

Invalid "Date" values should not be used

不应使用无效的日期值(需要确定year\month\day的有效取值范围)

 

 

 

 

Java 8 features should be preferred to Guava

Java 8 特性应该优先于 Guava 特性(Guava 特性修复了 java 7 中一些缺少的 Api,在 java8 中,这些 Api 被修复)

 

 

 

 

Java 8's "Files.exists" should not be used

Java 8 中不应该使用"Files.exists"方法(exists 方法在 JDK 8 中性能明显较差,当用于检查实际上不存在的文件时,会显著降低应用程序的运行速度。)

 

 

 

 

Jump statements should not be redundant

不应该有多余的跳转语句

 

 

 

 

Jump statements should not occur in "finally" blocks

跳转语句(break, continue, return, throw, goto)不应该出现在 finally 代码块中

 

 

 

 

JUnit assertions should not be used in "run" methods

JUnit 断言不应该在"run"方法中使用

 

 

 

 

JUnit framework methods should be declared properly

应该正确地声明JUnit框架方法(命名要正确)

 

 

 

 

JUnit rules should be used

应该使用 JUnit 规则(没有被使用的任何测试类字段都不应该被定义)

 

 

 

 

JUnit test cases should call super methods

JUnit 测试用例应该调用 super() 方法

 

 

 

 

Labels should not be used

Labels 不应该被使用

 

 

 

 

Lambdas containing only one statement should not nest this statement in a block

只包含一条语句的 Lambdas(匿名函数)不应该将此语句嵌套在块中(无需用{})

 

 

 

 

Lambdas should be replaced with method references

应该用方法引用替换 Lambdas(匿名函数)

 

 

 

 

LDAP connections should be authenticated

应该对 LDAP 连接进行身份验证

 

 

 

 

LDAP deserialization should be disabled

应该禁用 LDAP 反序列化

 

 

 

 

Local variable and method parameter names should comply with a naming convention

局部变量和方法参数的名称应该符合命名约定

 

 

 

 

Local variables should not be declared and then immediately returned or thrown

不应该在声明局部变量后,立即将变量返回或抛出

 

 

 

 

Local variables should not shadow class fields

局部变量不应该和类字段同名

 

 

 

 

Locks should be released

锁应该被释放

 

 

 

 

Loggers should be named for their enclosing classes

日志记录器应该用他们的封闭类来命名

 

 

 

 

Loop conditions should be true at least once

循环体至少需要被执行一次

 

 

 

 

Loops should not be infinite

循环不应该是无限的

 

 

 

 

Loops should not contain more than a single "break" or "continue" statement

循环应该只包含一个"break"或"continue"语句

 

 

 

 

Loops with at most one iteration should be refactored

最多只执行一次的循环应该被重构

 

 

 

 

Map values should not be replaced unconditionally

不应该无条件的替换映射(Map)值

 

 

 

 

Maps with keys that are enum values should be replaced with EnumMap

带有 enum 值键的映射应该替换为 EnumMap

 

 

 

 

Math operands should be cast before assignment

应该在数学计算之前,至少对一个操作数完成对最终类型的强制类型转换

 

 

 

 

Method names should comply with a naming convention

方法的命名应该满足命名规则

 

 

 

 

Method overrides should not change contracts

方法重写不应更改约定(超类方法参数如果被 @Nullable、@CheckForNull、@NotNull、@NonNull 和 @NonNull 修饰,则子类重写的方法参数也应该有相应的限制)

 

 

 

 

Method parameters, caught exceptions and foreach variables' initial values should not be ignored

方法参数、捕获的异常和 foreach 变量的初始值不应该被忽略

 

 

 

 

Methods "wait(...)", "notify()" and "notifyAll()" should not be called on Thread instances

方法"wait(…)","notify()"和"notifyAll()"不应该在线程实例上调用

 

 

 

 

Methods and field names should not be the same or differ only by capitalization

类里面的方法和字段名不应该完全相同或者仅大小写不同

 

 

 

 

Methods and field names should not be the same or differ only by capitalization

在随机整数生成中,不应该使用返回浮点值的随机方法

 

 

 

 

Methods returns should not be invariant

方法返回不应该是不变的

 

 

 

 

Methods should not be empty

方法不应该是空的

 

 

 

 

Methods should not be named "tostring", "hashcode" or "equal"

方法不应该被命名为"tostring"、"hashcode"或"equal"

 

 

 

 

Methods should not call same-class methods with incompatible "@Transactional" values

方法不应该调用具有不兼容的"@Transactional"值的同类方法

 

 

 

 

Methods should not have identical implementations

两个方法不应该有相同的实现

 

 

 

 

Methods should not have too many parameters

方法不应该有太多的参数

 

 

 

 

Methods should not return constants

方法不应该返回常量

 

 

 

 

Min and max used in combination should not always return the same value

组合使用的 Min 和 Max 不应该总是返回相同的值

 

 

 

 

Modifiers should be declared in the correct order

修饰符应该按照正确的顺序声明

 

 

 

 

Multiline blocks should be enclosed in curly braces

多行代码块应该用大括号括起来

 

 

 

 

Multiple variables should not be declared on the same line

多个变量不应该在同一行中声明

 

 

 

 

Mutable fields should not be "public static"

可变字段不应该是"public static"

 

 

 

 

Neither "Math.abs" nor negation should be used on numbers that could be "MIN_VALUE"

Math.abs 和逻辑非的运算不应该作用在可以设置为 MIN_VALUE 的数字上

 

 

 

 

Neither DES (Data Encryption Standard) nor DESede (3DES) should be used

不应该使用 DES(数据加密标准)或 DESede (3DES)

 

 

 

 

Nested "enum"s should not be declared static

嵌套的枚举类型不应该声明为静态的

 

 

 

 

Nested blocks of code should not be left empty

嵌套的代码块不应该是空的

 

 

 

 

Nested code blocks should not be used

不应该使用嵌套代码块

 

 

 

 

Non-constructor methods should not have the same name as the enclosing class

非构造函数方法不应该具有与所包含类相同的名称

 

 

 

 

Non-primitive fields should not be "volatile"

非基础字段(数组、对象等)不应该被 volatile 修饰符修饰

 

 

 

 

Non-public methods should not be "@Transactional"

不应该在非 public 方法上添加 @Transactional注解

 

 

 

 

Non-serializable classes should not be written

类应该都是可序列化的

 

 

 

 

Non-serializable objects should not be stored in "HttpSession" objects

不可序列化的对象不应该存储在"HttpSession"对象中

 

 

 

 

Non-thread-safe fields should not be static

非线程安全字段不应该是静态的

 

 

 

 

Null checks should not be used with "instanceof"

判空检查不应与"instanceof"一起使用

 

 

 

 

Null pointers should not be dereferenced

不应该取消对空指针的引用

 

Major

 

 

Null should not be returned from a "Boolean" method

不应该从返回值为布尔类型的方法返回 Null

 

 

 

 

Nullness of parameters should be guaranteed

应保证方法参数不为空

 

 

 

 

Objects should not be created only to "getClass"

对象不应该只为了"getClass"方法创建(仅仅为了调用 getClass 而创建对象是对内存和周期的浪费)

 

 

 

 

Only static class initializers should be used

应该只使用静态初始化方法

 

 

 

 

Optional value should only be accessed after calling isPresent()

在调用 get() 方法之前,应该先判空处理

 

 

 

 

Overrides should match their parent class methods in synchronization

子类重写的方法应该与父类方法的同步保持一致

 

 

 

 

Overriding methods should do more than simply call the same method in the super class

子类中重写一个方法不应该只是为了简单的调用父类的同名方法

 

 

 

 

Package declaration should match source file directory

包声明应该匹配源文件目录

 

 

 

 

Package names should comply with a naming convention

包的名称应该符合命名规则

 

 

 

 

Packages containing only "package-info.java" should be removed

只包含"package-info.java"包应该被删除

 

 

 

 

Parameters should be passed in the correct order

方法的参数应该按照正确的顺序传递

 

 

 

 

Parentheses should be removed from a single lambda input parameter when its type is inferred

带单参数的 lambda(匿名函数),应该将该参数的圆括号删除

 

 

 

 

Parsing should be used to convert "Strings" to primitives

可以使用解析方法将 String 解析为期望的基本类型

 

 

 

 

Persistent entities should not be used as arguments of "@RequestMapping" methods

持久化实体不应该用作"@RequestMapping"方法的参数

 

 

 

 

Primitive wrappers should not be instantiated only for "toString" or "compareTo" calls

应该使用基本包装器类的静态 toString() 或 compare() 方法

 

 

 

 

Primitives should not be boxed just for "String" conversion

不应该为了调用 toString() 方法而将基本类型的数据进行类型转换

 

 

 

 

Printf-style format strings should be used correctly

Printf 启用 style 格式字符串应该被正确使用(Printf-style 的字符串是在运行时解释的,而不是由编译器验证的,所以它们可能包含导致创建错误字符串的错误)

 

 

 

 

Printf-style format strings should not lead to unexpected behavior at runtime

Printf-style 格式字符串不应该在运行期间导致意外的操作发生

 

 

 

 

Private fields only used as local variables in methods should become local variables

只在方法中用作局部变量的私有字段应该设置为局部变量

 

 

 

 

Public constants and fields initialized at declaration should be "static final" rather than merely "final"

在初始化时声明的公共常量和字段应该是"static final",而不仅仅是"final"

 

 

 

 

Raw byte values should not be used in bitwise operations in combination with shifts

带符号的原始字节值不应该进行位移操作

 

 

 

 

Reading the Standard Input is security-sensitive

读取标准输入的数据是不安全的

 

 

 

 

Receiving intents is security-sensitive

公开的接收器是不安全的

 

 

 

 

Redundant casts should not be used

不应该使用冗余类型转换

 

 

 

 

Redundant pairs of parentheses should be removed

应该删除多余的括号

 

 

 

 

Reflection should not be used to check non-runtime annotations

反射不应用与检查非运行时注解(只有已被赋予运行时保留策略的注释才可用于反射。使用其他保留策略测试总是返回 false)

 

 

 

 

Related "if/else if" statements should not have the same condition

相关的 if.../else if... 代码块中不应该有相同的判断条件

 

 

 

 

Resources should be closed

(实现 close-able 接口或其超级接口 autoclose-able 的连接、流、文件和其他)类在使用后需要关闭。必须在 finally 块 else 中执行 close 调用,否则将无法执行调用

 

 

 

 

Return of boolean expressions should not be wrapped into an "if-then-else" statement

布尔表达式的返回不应该封装到"if-then-else"语句中

 

 

 

 

Return values from functions without side effects should not be ignored

不应该忽略没有副作用的函数的返回值(可能是无效代码,或者代码的效果与预期不符)

 

 

 

 

Return values should not be ignored when they contain the operation status code

不应该忽略返回值中包含的操作状态代码

 

 

 

 

Sections of code should not be commented out

不应该保留被注释的代码

 

 

 

 

Sending emails is security-sensitive

代码中发送电子邮件是不安全的

 

 

 

 

Servlets should not have mutable instance fields

Servlets 实例中不应该包含可变的字段

 

 

 

 

Setting JavaBean properties is security-sensitive

设置 JavaBean 属性是不安全的

 

 

 

 

Short-circuit logic should be used in boolean contexts

短路逻辑应该在布尔上下文中使用

 

 

 

 

Silly bit operations should not be performed

有些可预期得到结果的位操作(如 & 1得到原始值)是不需要执行的

 

 

 

 

Silly equality checks should not be made

一些对等检查是不需要做的(不同类型的判等、两个数组的判等)

 

 

 

 

Silly math should not be performed

一些可预测结果的数学运算不需要做(如 x % 1)

 

 

 

 

SMTP SSL connection should check server identity

SMTP SSL 连接应该检查服务器标识

 

 

 

 

Source files should not have any duplicated blocks

原文件中不应该存在重复的块

 

 

 

 

Standard outputs should not be used directly to log anything

应该使用日志程序记录输出内容(便于检索)

 

 

 

 

Static fields should not be updated in constructors

不应该在构造函数中更新静态的字段

 

 

 

 

Static non-final field names should comply with a naming convention

被 static 修饰(但未被 final 修饰)的字段,命名应该符合命名规范

 

 

 

 

String function use should be optimized for single characters

字符串函数(如 indexOf(""))的使用应该优化为单个字符

 

 

 

 

String literals should not be duplicated

字符串文字不应该重复

 

 

 

 

String offset-based methods should be preferred for finding substrings from offsets

基于字符串偏移量的方法才应该是从偏移量中寻找子字符串的首选方法

 

 

 

 

String.valueOf() should not be appended to a String

valueof() 不应该被附加到字符串中

 

 

 

 

Strings and Boxed types should be compared using "equals()"

字符串内容以及数据类型的比较应该使用 equals() 方法

 

 

 

 

Strings should not be concatenated using '+' in a loop

字符串在遍历过程中不应该通过"+"号来进行扩展(应该使用 append())

 

 

 

 

Struts validation forms should have unique names

Struts 验证表单应该名称惟一

 

 

 

 

Subclasses that add fields should override "equals"

父类中包含 equals() 方法,添加了字段的子类中需要重写 equals() 方法

 

 

 

 

Switch cases should end with an unconditional "break" statement

Switch case 应该以无条件的"break"语句结束

 

 

 

 

Synchronization should not be based on Strings or boxed primitives

同步不应该基于字符串或基础类型的数据

 

 

 

 

Synchronized classes Vector, Hashtable, Stack and StringBuffer should not be used

不应该使用 Synchronized 修饰类向量、散列表、堆栈和 StringBuffer

 

 

 

 

Ternary operators should not be nested

三元式运算不应该嵌套

 

 

 

 

TestCases should contain tests

测试用例文件中应该包含测试方法

 

 

 

 

Tests should include assertions

测试应该包含断言(该条规则支持自扩展)

 

 

 

 

Tests should not be ignored

不应该跳过测试

 

 

 

 

The default unnamed package should not be used

不应该使用默认的未命名包

 

 

 

 

The diamond operator ("<>") should be used

应该使用 diamond 操作符("<>")(不必在声明和构造函数中都声明 Lis t的类型,可以使用 <> 简化构造函数声明,编译器将推断出类型。)

 

 

 

 

The non-serializable super class of a "Serializable" class should have a no-argument constructor

可序列化类的不可序列化超类应该包含无参的构造函数

 

 

 

 

The Object.finalize() method should not be called

不应该调用 Object.finalize() 方法(Object.finalize() 方法应该由垃圾回收器调用)

 

 

 

 

The Object.finalize() method should not be overriden

Object.finalize() 不应该被重载(应该只由垃圾回收器调用)

 

 

 

 

The signature of "finalize()" should match that of "Object.finalize()"

"finalize()"的签名应该与"Object.finalize()"的签名匹配(Object.finalize() 方法应该由垃圾回收器调用,其他方法不应该命名为 finalize)

 

 

 

 

The value returned from a stream read should be checked

应该检查从流读取的返回值的长度是否大于0(不能保证流返回的不是0字节)

 

 

 

 

Throwable and Error should not be caught

Throwable 和 Error 不应该被捕获(Throwable 是所有异常的超类, Error 是所有错误的超类,程序捕捉到也无法处理)

 

 

 

 

Throwable.printStackTrace(...) should not be called

printStackTrace(…) 不应该被调用(默认情况下,printStackTrace(…)将一个 Throwable 及其堆栈信息打印到某个流,这可能会无意中暴露敏感信息)

 

 

 

 

Track uses of "FIXME" tags

跟踪"FIXME"标签的使用(FIXME 标记通常用于标记怀疑有 bug 的地方,但是开发人员希望稍后处理这些地方。)

 

 

 

 

Track uses of "TODO" tags

跟踪 TODO 标签

 

 

 

 

TrustManagers should not blindly accept any certificates

TrustManagers(信托管理) 不能盲目的接受任何证书

 

 

 

 

Try-catch blocks should not be nested

不应该嵌套的使用 try-catch 代码块

 

 

 

 

Try-with-resources should be used

应该使用 try-with 启用 resources 结构(代替 try-finally 结构)

 

 

 

 

Two branches in a conditional structure should not have exactly the same implementation

(switch 启用 case/if...else if/if...else)条件结构中的两个分支不应该具有完全相同的实现

 

 

 

 

Type parameter names should comply with a naming convention

类型参数名称应该符合命名约定

 

 

 

 

Unary prefix operators should not be repeated

不应该重复使用一元表达式的前缀操作符(针对于"!, ~, -, +")

 

 

 

 

Unnecessary imports should be removed

应该删除不必要的 import

 

 

 

 

Untrusted XML should be parsed with a local, static DTD

不可信的 XML 应该使用本地静态 DTD 进行解析

 

 

 

 

Unused "private" classes should be removed

应该删除未使用的 private 类(未使用的私有类属于死代码)

 

 

 

 

Unused "private" fields should be removed

未使用的 private 字段应该被删除(死代码应该被处理)

 

 

 

 

Unused "private" methods should be removed

未使用的 private 方法应该被删除(死代码应该被清理)

 

 

 

 

Unused labels should be removed

未使用的标签应该被删除

 

 

 

 

Unused local variables should be removed

未使用的局部变量应该被删除

 

 

 

 

Unused method parameters should be removed

方法中未使用的参数应该被删除

 

 

 

 

Unused type parameters should be removed

未使用的方法返回参数类型应该被删除

 

 

 

 

URIs should not be hardcoded

URI永远不应该硬编码,应该用可定制的参数替换它,保证代码的可移植性(此外,即使动态获取URI的元素,如果路径分隔符是硬代码,那么可移植性仍然是有限的)

 

 

 

 

Using command line arguments is security-sensitive

使用命令行参数是不安全的

 

 

 

 

Using environment variables is security-sensitive

使用环境变量是不安全的

 

 

 

 

Using hardcoded IP addresses is security-sensitive

硬编码(直接编码)IP 地址是不安全的

 

 

 

 

Using non-standard cryptographic algorithms is security-sensitive

使用非标准的密码编码算法是不安全的

 

 

 

 

Using pseudorandom number generators (PRNGs) is security-sensitive

使用伪随机数生成器是不安全的(确定的算法产生的随机数都是伪随机数,很容易被黑客获取 seed 从而破解)

 

 

 

提醒

Using regular expressions is security-sensitive

使用正则表达式是不安全的(影响性能)

 

 

 

 

Using Sockets is security-sensitive

(直接)使用套接字是不安全的

 

 

 

 

Using unsafe Jackson deserialization configuration is security-sensitive

不应该使用不安全的 JACKSON 反序列化方法(如果可能,使用 @JsonTypeInfo(use = Id. name) 代替 @JsonTypeInfo(use = Id. class) 或 @JsonTypeInfo(use = Id. MINIMAL_CLASS),因此需要使用 @JsonTypeName 和 @JsonSubTypes 注解)

 

 

 

 

Utility classes should not have public constructors

Utility 是静态类,不能被实例化,就算扩展,也不应该有公共的构造函数

 

 

 

 

Validating SSL/TLS connections is security-sensitive

验证 SSL/TLS 链接是不安全的(SSL/TLS 协议加密网络连接,服务器通常提供一个数字证书来证明其身份。接受所有 SSL/TLScertificates 会使应用程序容易受到中间人攻击(Man-in-the-middle attack, MITM)的攻击)

 

 

 

 

Value-based classes should not be used for locking

基于值的类不应该用于锁定(基于值的类只为了作为值的包装器,没有构造函数,通过工厂化方法实例化,不会指定返回实例的标识)

 

 

 

 

Values should not be uselessly incremented

值不应该毫无意义的递增

 

 

 

 

Variables should not be self-assigned

变量不应该自赋值

 

 

 

 

Weak SSL protocols should not be used

不应该使用弱 SSL 协议

 

 

 

 

Web applications should not have a "main" method

web 应用不应该有 main() 方法

 

 

 

 

Week Year ("YYYY") should not be used for date formatting

日期格式不应使用 Week Year ("YYYY") (因为存在一周中跨年的情况)

 

 

 

 

Writing cookies is security-sensitive

编写 cookies 是不安全的(cookie 应该只用于管理用户会话。最佳实践是将所有与用户相关的信息保存在服务器端,并将它们链接到用户会话,而不是将它们发送到客户机)

 

 

 

 

XML transformers should be secured

XML 转换程序应该受到保护

 

 

 

 

Zero should not be a possible denominator

0不应该被作为分母