没有合适的资源?快使用搜索试试~ 我知道了~
借助SpotBugs将程序错误扼杀在摇篮中.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 2 浏览量
2022-07-08
15:50:08
上传
评论
收藏 2.21MB DOC 举报
温馨提示
试读
11页
借助SpotBugs将程序错误扼杀在摇篮中.doc
资源推荐
资源详情
资源评论
借助 SpotBugs 将程序错误扼杀在摇篮中
推荐一个静态代码扫描工具 SpotBugs,让你下班没烦恼
背景
最近一年多在一家 toB 业务的公司,部门主要做的是建筑行业的招投标业务信息化,希望
借助软件来达到“阳光、降本、提效”的目的,我刚入职时大概 30 多家客户,截止现在已经
超过 100 家,发展势头迅猛,随之而来也暴露出来一个很严重的问题:“质量差,线上反馈
多。”
大伙每天疲于处理线上反馈,需求响应缓慢,交付速度跟不上市场节奏,长此下去对团队
士气是一种打击也会激化研发和业务的矛盾,鉴于此我们对线上反馈进行了逐个分析、打标,
最终的结论是:“大部分反馈是由于客户一些个性化需求导致逻辑冲突,太多的开关充斥在
代码中有时会顾此失彼,还有一部分完全是编码层面的低级问题,空指针、跨类型的 equals
等”,对于需求问题由产品经理和研发经理把控,不接稀里糊涂的需求,对于低级别的编码
问题由我牵头出具一些优化方案。
研发流程现状
“开发-》测试-》上线-》线上环境复测”,很简洁的一个流程吧,在当初业务量小、团队小
的时候确实没什么问题,响应也快,但是现在人员规模 30+的团队还是用这种简单的流程,
已然是不合适了,必须增加一些手段来保证开发质量,让一些低级错误扼杀在摇篮中,首当
其要的是改善现有的研发流程,增加一些必要的自检和 code review,初步改善以后为:“拉
取私有分支-》开发-》自测-》提交 Pull Request 合流-》组内同事 code review-》测试-》上线
-》线上环境复测”,在初期确实是收到了一些收益,一些低级别的问题通过“人肉”确实能发
现不少,但是到了大家都赶进度的时候就完全靠不住,原因你懂得。
上工具
引用我之前公司 CTO 的一句话:“靠人终归是靠不住的,最好靠遵循规则的机器。“
人都是有惰性的,靠管理制度来提高研发质量这种精神值得鼓励但是不提倡,找到顺手的
工具才是我们的解决之道,将工具和管理制度结合起来,接下来就是我们本篇的重点
SpotBugs,一个静态代码扫描工具。
静态代码扫描概念
静态源代码扫描是近年被人提及较多的软件应用安全解决方案之一。它是指在软件工程中,
程序员在写好源代码后,无需经过编译器编译,而直接使用一些扫描工具对其进行扫描,找
出代码当中存在的一些语义缺陷、安全漏洞的解决方案。静态扫描技术已经从 90 年代时候
的,编码规则匹配这种由编译技术拓展过来的分析技术向程序模拟全路径执行的方向发展,
由此,这种模拟执行相对的执行路径比动态执行更多,能够发现很多动态测试难以发现的缺
陷。
静态代码扫描优点
这个方案的优点在于,无需进行编译、也无需去搭建运行环境,就可以对程序员所写的源
代码进行扫描。可以节省大量的人力和时间成本,提高开发效率,并且能够发现很多靠人力
无法发现的安全漏洞,站在黑客的角度上去审查程序员的代码,大大降低项目中的安全风险,
提高软件质量。
静态代码扫描缺点
传统的静态分析,传统的静态分析都是基于语法解析或者编译器,这些方式分析代码的缺
陷是以代码所匹配的规则模式(patterns)去评估代码,只要模式匹配或者相似就报出来。
需要人工去分辨出其中的真假,主要存在的问题:
– False positive(误报)
– False negative(漏报)
以上内容来源于百度百科
案例
案例一 空指针
这真的是一个很低级的问题了,不见得是能力问题,稍不留神很容易出,||写成&&,少加
个!之类的。
List> resultMap = getBasedao().queryList(sql, paramMap);
if (resultMap == null && resultMap.isEmpty()) {
}
修复方法 1:
if (resultMap == null || resultMap.isEmpty())
修复方法 2:
if (CollectionUtils.isEmpty(resultMap ))
推荐使用工具类的判断方法,将重复性的事情交给工具类来干,减少出错的可能性,而且
代码的描述性更强,isEmpty,isNotEmpty 等等。
案例二 返回值被忽略
String querySql = “select * from biz_table where id=xxx”;
Map query = getBasedao().query(querySql);
if (query == null) {
querySql.replace(“biz_table “,”biz_table _history”);
query = getBasedao().query(querySql);
}
修复方法:
接收返回值,querySql = querySql.replace
案例三 equals 两个不相关的对象
这个绝对是能力问题了,“钢筋”和“混凝土”怎么能 equals 呢,Class 都不一样。
List> maps = getBasedao().queryList(sql, map);
if(CollectionUtils.isEmpty(maps)) {
return null;
}
if(maps.get(0).equals(““)) {
return null;
}
剩余10页未读,继续阅读
资源评论
书博教育
- 粉丝: 1
- 资源: 2835
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功