Sonar代码扫描常见规则

最近公司项目交付,交付前集成,功能,性能,安全种种测试工作就来了,由于测试离职,被抓壮丁,兼职起测试修改工作。小公司,平时敲(ctrl+c)代码(ctrl+v)
时,同事也不在意一些代码规范,以及一些常见的规约要求(阿里规约),所以代码扫描一地bug,漏洞,以及坏味道,道人委实因为这恨加了几天班。(心疼道人3秒)

因此,如果项目交付需要进行代码质量扫描等工作,一定要将代码规范写进公司代码规范中,并严格遵守。

程序员啦,代码提交时,idea编辑工具的话,可以使用sonarLine插件进行代码扫描,并修改扫描出的问题,再进行提交;或者使用阿里规约进行代码检测(至于sonar Rule 设置,后续博文会进行更新),下面是平时代码中常见的一些问题,希望对各位道友有所帮助。


注:括号中为sonar扫描规则

(1)非空判断(Nullcheck of value previously dereferenced)

错误代码

List<Map<String, Object>> rows
= (List<Map<String, Object>>) dao.pagedQuery(sqlKey, param, pageIndex,pageSize);
Map<String, Object> map = new HashMap<String, Object>();
int fileId = -1;
// for循环中 未做rows的非null判断
for (Map<String, Object> item : rows) {map.clear();...
}

修改方案

...
if (rows != null && !rows.isEmpty()) {for (Map<String, Object> item : rows) {map.clear();...}
}

(2) Map集合迭代时,采用EntrySet迭代器而不是KeySet迭代器【性能因素】(Inefficient use of keySet iterator instead of entrySet iterator)

错误代码(KeySet迭代器)

Map<String, String> param = new HashMap<>();
//开始循环
for (String key : param.keySet()) {list.add(new BasicNameValuePair(key, param.get(key)));
}

修改方案(EntrySet迭代器)

Map<String, String> param = new HashMap<>()
//请求参数转换
for (Map.Entry<String, String> entry : param.entrySet()) {list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}

(3)日志记录使用日志框架(log4j)(User a logger to log exception)

错误示例

try{
...
} catch (Exception e) {e.printStackTrace();
}

修改为

private static Logger logger = Logger.getLogger(FileTransferService.class);
...
try{
...
} catch (Exception e) {logger.error("getSetFileTransferObjectClass is Error!", e);
}

(4) 不需要使用封装类来定义布尔类型常量 (method needlessly boxes a boolean constant)

// 不推荐(涉及数据的自动装箱、拆箱)
Boolean b = true;
--------------------
// 推荐写法
boolean b = true;
// 或者
Boolean b = Boolean.TRUE;

(5)字节数组或字符串编码转化时,需要指定编码格式(Method encodes String bytes without specifying the character encoding)

// 推荐写法
String string2 = new String(string1.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8));
// 或者
String string3 = new String(string1.getBytes(), StandardCharsets.UTF_8));byte[] data = string3.getBytes(StandardCharsets.UTF_8);

(6) StringBuffer或StringBuilder字符串拼接时,传递简单的连接字符串(Method passes simple concatenating string in StringBuffer or StringBuilder append)

不推荐写法

StringBuilder columnStr = new StringBuilder();
List<Map<String, String>> list = tableMap.get(key);
for (Map<String, Object> map : list) {columnStr.append(StringUtil.convertToString(map.get("COLUMN")) + ",");
}

推荐写法

StringBuilder columnStr = new StringBuilder();
List<Map<String, String>> list = tableMap.get(key);
for (Map<String, Object> map : list) {columnStr.append(StringUtil.convertToString(map.get("COLUMN"))); columnStr.append(",");
}

(7)split()函数特殊字符问题("." or “|” used for regular expression)

java中split()特殊符号"." “|” “*” “” “]”

- 关于点的问题是用string.split("[.]") 解决。
- 关于点的问题是用string.split("\\.") 解决。
- 关于竖线的问题用 string.split("\\|")解决。
- 关于星号的问题用 string.split("\\*")解决。
- 关于斜线的问题用 sring.split("\\\\")解决。
- 关于中括号的问题用 sring.split("\\[\\]")解决。

(8)魔数问题(坏味道)
0,1;“0”,“1” 其余所有变量引用,或者直接使用该变量都不符合Sonar的代码规范规则。

代码示例

// 不推荐的写法
if("old".equals(type)){...
}
// 推荐写法
String oldIndex = "old";
if (oldIndex.equals(type)){...
}

(9) Map,List等常用容器初始化需设置初始化大小(性能问题)

原因:以HashMap和ArrayList为例:

  • HashMap 扩容时(数据大小 >= 初始化容器大小【默认16】 * 负载因子【0.75】),
    会进行数据的rehash,和数据的移动影响性能。
  • ArrayList 扩容时,会进行数组大小(1.5倍)扩增;涉及到数组中元素的复制,然后copy
    到新的数组中。 复制影响性能,根据业务减少扩容次数。

注意事项:HashMap 的初始化大小必须是2的次幂(原因是:HashMap的hash算法与扩容机制【数据平移】决定)。

// 不推荐写法
Map<String, String> pMap = new HashMap<>();
// 推荐写法
Map<String, String> pMap = new HashMap<>(32);

Sonar代码扫描常见规则总结相关推荐

  1. 看这里,全网最详细的Sonar代码扫描平台搭建教程

    01 Sonar安装 官网:https://www.sonarqube.org/ 1.sonar简介 sonar是一款静态代码质量分析工具,支持Java.Python.PHP.JavaScript.C ...

  2. java代码扫描项目,sonar代码扫描实现(基于java-maven)

    Sonar介绍 Sonar是一个用于代码扫描检测的开放平台.可以实现对不同语言(java.python.php.C++.C#等等)的项目代码进行分析,同时可以集成不同的测试工具.代码分析工具,以及持续 ...

  3. jenkins:集成sonar代码扫描+发送邮件

    前提: Jenkins JDK 目录: 1.安装sonar插件:SonarQube Scanner for Jenkins 2.安装SonarQube 3.安装sonar-scanner ++++++ ...

  4. 持续集成与自动化部署 - jenkins sonar代码质量管理平台 部署和基础使用(五)...

    1 jenkins 安装参考链接 1.1 安装jenkins [root@test-node3 ~]# yum install -y java-1.8.0 [root@test-node3 ~]# c ...

  5. Sonar安全扫描代码规则

    Sonar安全扫描代码规则 blocker级别 序号 分类 规则英语描述 翻译解读 1 Bug Loops should not be infinite 循环必须有一个终止条件 2 Bug Overr ...

  6. java代码扫描工具比较_代码扫描工具的选型和Sonar最佳实践

    目标 在编码阶段发现NNE空指针异常.IO流未正确关闭等致命性bug,杜绝此类"零容忍"线上异常的发生. 技术选型 关于代码扫描工具,比较主流的有Sonar.FindBugs.Al ...

  7. 【sonar集成jenkins实现静态代码扫描】

    一 jenkins安装 由于公司的jenkins是用于做服务部署,不能够安装集成需要的sonarqube-scanner插件,所以我们需要自己安装一个jenkins,jenkins的安装可以通过hom ...

  8. pmd java规则_静态代码扫描 (一)——PMD 自定义规则入门

    阅读该文章前,最好已经对 PMD 有了初步的认识和了解,可参考静态分析工具 PMD 使用说明 准备工作 首先在PMD 官网下载最新版本的文件,目前最新版本是 5.4.1. 下载 pmd-bin-5.4 ...

  9. 代码漏洞扫描常见漏洞

    代码漏洞扫描常见漏洞 1.日志注入(Log Forging漏洞) 漏洞描述 将未经验证的用户输入写入日志文件可致使攻击者伪造日志条目或将恶意信息内容注入日志. 在以下情况下会发生日志伪造的漏洞: 数据 ...

最新文章

  1. 详解深度学习中的Normalization,不只是BN(1)
  2. JAVAOO 14 16章
  3. 编程方法学9:字符串
  4. oracle删除所有触发器的命令,Oracle删除当前用户的所有对象(表、视图、触发器、存储过程、函数)...
  5. 雷林鹏分享:Ruby Web Services 应用 - SOAP4R
  6. python列表去掉特定项_python实现删除列表中某个元素的3种方法
  7. 利用反射获得类的public static/const成员的值
  8. java学习笔记之数组
  9. php curl cookie,php中curl获取返回页面的cookie
  10. php分布式的锁,laravel分布式并发锁
  11. 信息安全工程师笔记-RSA密码
  12. mysql与php6_PHP与MySQL的连接
  13. 数据挖掘的步骤有哪些
  14. 死链对网站的影响、产生过程、解决办法汇总
  15. LeetCode每日一题: 1723. 完成所有工作的最短时间
  16. 无符号数与符号数比较大小
  17. K8S控制器介绍与使用
  18. 生成SAML所需X509证书
  19. springboot启动画面看腻了,换一个试试?
  20. mac 查ip linux,如何通过mac地址查ip,小编教你Mac怎么查看ip地址

热门文章

  1. UE4(虚幻4)预算上的纹理流送池(texture streaming poor over)报警解决方法
  2. 保温夹层滤芯式过滤器
  3. 动态下载苹果提供的多种中文字体
  4. chrome linux依赖包,[WebDriver]Linux/Docker下安装Chrome浏览器和ChromeDriver
  5. HTTP协议 --HTTP协议详解
  6. 3d打印 计算机芯片,提高计算机芯片数据路由能力!3D打印最小龙勃透镜诞生
  7. 地表最强AI 辅助编程工具——GitHub Copilot安装教程
  8. 关于医保你可能不了解的
  9. 卡位亚洲新门户,华为云泰国开服
  10. NBIS单细胞教程:差异基因(五)