之前看到过几次关于代码质量方面的帖子,不巧,本人正好是做静态分析工具的码农,这方面接触的比较多,可以简单说一说我了解的东西
首先我要先开启语言圣战,提高代码质量其实是新语言出现的核心动力之一。有这项需求的新语言往往会通过各种手段去解决想要干掉的语言的设计问题、提供更加可靠便捷的 toolchain,便于程序员产出、维护高质量的代码。 所以如果想写“clean code”,换语言其实是一个不错的选择。比如 Rust 对于 C++,Kotlin 对于 Java,TS 对于 JS。虽然他们可能会引入新的问题,但如果你的目标是解决旧问题,那他们一般都十分可靠。
然后说说工具的问题。我用过的开源、商业代码质量工具没少说也有个二三十种( 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 数量也是重点。过于繁多的报告(尤其是项目早期开发的时候)往往不利于发现真正有价值的问题,也不利于修复。所以熟悉工具的规则和配置,少报无关问题是工具使用的关键。
简单说就这么多,如果感兴趣我有空可以开个系列,专门介绍代码静态分析的技术、使用问题
最后我悄咪咪地打个广告,我司的产品,中国最好的静态分析工具(将来就是世界最好)
对标国际厂商比如 Coverity、fortify、checkmax,我们一点不虚,甚至在技术上还有优势( PLDI、ICSE 最近几年都有论文) 采购过类似产品或者想采购的土豪可以留意一下我们
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.