推荐几款代码检查工具,淘宝开源代码质量检测工具
好的代码一定是整洁的,并且能够帮助阅读的人快速理解和定位。好的代码可以加快应用的开发迭代速度,不必花过多的时间来修复 bug 和完善代码。好的代码不但能够使得新的项目成员更容易加入项目,同时方便项目组成员快速做好 Back up。好的代码便于促进团队间交流合作提升开发效率。
代码质量评价标准
有编码经验的人对代码都有一定的“鉴赏力”,能够凭感觉给出代码好坏的主观评价。但是这种凭感觉的方式太过个性随意,所谓仁者见仁智者见智,很难达成共识,那有没有一种公认的标准来鉴定代码质量呢?
答案是有的。这里简单分享当下较常用的评价标准,其中包括:编码规范、可读性、可维护性、重复度及可测试性。
编码规范
主要包含是否遵守了最佳实践和团队编码规范,是否包含可能出问题的代码,以及可能存在安全的漏洞。编码规范有助于提高团队内协助的效率以及代码的可维护性。
可读性
Code Review 是一个很好的测验代码可读性的手段。如果你的同事可以轻松地读懂你写的代码,那说明你的代码可读性很好;反之则说明你的代码可读性有待提高了。遵守编码规范也能让我们写出可读性更好的代码。
可维护性
代码的可维护性是由很多因素协同作用的结果。代码的可读性好、简洁、可扩展性好,就会使得代码易维护;更细化地讲,如果代码分层清晰、模块化好、高内聚低耦合、遵从基于接口而非实现编程的设计原则等等,那就可能意味着代码易维护。除此之外,代码的易维护性还跟项目代码量的多少、业务的复杂程度、利用到的技术的复杂程度、文档是否全面等诸多因素有关。
重复度
遵守 Don’t Repeat Yourself 原则,尽量减少重复代码的编写,复用已有的代码。对项目定期进行代码重复度检测是一个很有意义的事,可以帮助开发人员发现冗余代码,进行代码抽象和重构。重复的代码一旦出错,意味着加倍的工作量和持续的不可控。如果代码中有大量的重复代码,就要考虑将重复的代码提取出来,封装成公共的方法或者组件。
可测试性
代码可测试性的好坏,同样可以反应代码质量的好坏。代码的可测试性差,比较难写单元测试,那基本上就能说明代码设计得有问题。
除此之外还有很多代码质量评价标准。我们需要一些取舍,选取部分大家有共识的规则定义团队好的代码标准。
代码质量维度
当前版本通过 @iceworks/doctor 从 5 个维度对代码进行评分:
最佳实践:通过 @iceworks/eslint-plugin-best-practices 分析项目,提出符合当前工程特征(对 ice 和 Rax项目友好)的最佳实践及阻塞问题发布卡口,帮助开发者优化项目性能,避免潜在 bug 。
安全实践:通过 @iceworks/eslint-plugin-security-practices 扫码代码检测工程中可能存在的安全风险,包含 url 、敏感成词、明文账密信息及 npm 包证书检测,降低项目安全风险,守卫项目安全。
阿里代码规范:这一维度主要反馈开发人员对于 eslint-config-ali 阿里开发规约的遵守程度。
可维护度:通过 typhonjs-escomplex 对文件进行扫码,得出每个文件的可维护度,可读性及复杂度评分。针对得分较差的文件可以进行深度分析帮助开发者更好的重构复杂代码。
重复度:通过 jscpd 计算重复出现的代码区块占比,计算出 clone 分数。并逐一列举重复的代码,方便开发者快速定位重复代码,将其封装成公共的方法或者组件。
根据上述 5 个维度通过加权平均的方式计算项目质量分,并根据木桶效应,在计算得分的过程中加大了最低分的权重,得出最终项目质量评分。
项目地址
github地址:https://github.com/ice-lab/iceworks/tree/master/
推荐几款代码质量检测工具:
然后说说工具的问题。我用过的开源、商业代码质量工具没少说也有个二三十种( V 站除了同行应该没人比我多了。。。吧)。这些工具如果按照规则类型划分,可以看做两类。一类安全,也就是检查安全问题,比如 NullPointer、SQL Injection、Data Race,他们会影响程序的安全运行;一类是规约,简单来说就是 code style。不过考虑到很多规则其实两者兼具,我就简单的按语言划分好了。(都是开源的)
c/c++:
clang-tidy http://clang.llvm.org/extra/clang-tidy
CSA https://clang-analyzer.llvm.org
cppcheck https://github.com/danmar/cppcheck
cpplint https://github.com/google/styleguide
phasar https://github.com/secure-software-engineering/phasar
这里面比较推荐 clang-tidy,虽然规则不多,但是规则编写简单,只要你对 C++有足够了解,可以定制出十分丰富的内容
java:
google-java-format https://github.com/google/google-java-format
find-sec-bugs https://find-sec-bugs.github.io
spotbugs https://spotbugs.github.io
pmd https://github.com/pmd/pmd
p3c https://github.com/alibaba/p3c
soot https://sable.github.io/soot
spotbugs 和 pmd 都是比较优秀的工具,前者有 find-sec-bugs 这样的插件。而后者,ali 的 p3c 规则集就是基于 pmd 实现的。此外 pmd 是一个针对多种语言的框架,内容十分丰富。这两者国际化和文档都做的非常好。而 soot 本质上一个 jvm bytecode 的优化框架,但同样可以基于此做出各种工具,不过考虑到它复杂的内容,emmmm…
其他:
python https://github.com/PyCQA/pylint
kotlin https://github.com/arturbosch/detekt
JS/TS https://github.com/eslint/eslint
Rust https://github.com/rust-lang/rust-clippy
shell https://github.com/koalaman/shellcheck
Multiple languages https://github.com/facebook/infer
Multiple languages https://github.com/github/semantic
我列举的都是我觉得有用的并且目前处于活跃状态的项目,大家无聊的话可以看看。还有一个专门介绍静态分析工具的仓库https://github.com/mre/awesome-static-analysis
再然后对于工具的使用。对于工具大家都知道,不用等于没用。所以一般的解决办法都是融入流程,最简单的像 Unittest 一样,编译完成后跑一遍。并入 CI 流程也是普遍做法,代码入库前扫描成功才允许合并,这样同时还可以保证 code format 的问题。除此之外,减少这类工具的 report 数量也是重点。过于繁多的报告(尤其是项目早期开发的时候)往往不利于发现真正有价值的问题,也不利于修复。所以熟悉工具的规则和配置,少报无关问题是工具使用的关键。
简单说就这么多,如果感兴趣我有空可以开个系列,专门介绍代码静态分析的技术、使用问题
号称中国最好的静态分析工具(将来就是世界最好)
https://www.sourcebrella.com/
对标国际厂商比如 Coverity、fortify、checkmax,我们一点不虚,甚至在技术上还有优势( PLDI、ICSE 最近几年都有论文)
原文地址: https://blog.csdn.net/weixin_45727359/article/details/109281769
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章