经过 Google 的许可,我现在将 PySonar 第二版本开源,就叫 PySonar2 吧。代码可以在我的 GitHub 下载:
https://github.com/yinwang0/pysonar2
经过一阵子考察之后,我发现 PySonar2 仍然是当今最先进的 Python 静态分析器。其分析的深度和准确程度其实超过了所有的 Python IDE (包括 PyCharm 3.0 在内)。PySonar2 做的是跨过程,具有精确控制流的分析,而现在最好的 Python IDE 仍然是局部过程分析。
PySonar2 的工作原理却极其简单,说白了就是:写一个 Python 解释器,然后想办法让它“停机”。实际上这个简单的方法超过了一些程序语言研究者花几十年做出来的“艰深理论”。比如 Olin Shivers 及其学生们的 control-flow analysis 系列 20 多年来的成果,当我看他们的论文的时候,发现他们其实在解决一个自己(不小心)造出来的问题。我一开头什么都不知道,全凭自己感觉出发,所以就没有走上那条不归路 ;-)
另外,其实给 Google 的代码里有一个很“严重”的 bug,导致算法成为指数时间复杂度,所以他们其实仍然在用第一版的代码 ;-) Sourcegraph.com 使用的也是第一版的代码。在 Coverity 的时候,我从他们的代码里面也发现同样的问题,对某些 benchmark 运行时间太长。最后被我两行代码修好了(虽然找到这两行代码花了好几天)。
最近重新燃起了对 PySonar 代码的兴趣。经过修改两行代码之后,这个性质与 Coverity 完全一样的 bug 被消灭掉了。然后又发现一些逻辑细节和数据结构性能上的问题,也逐渐修补了。现在它能够处理整个 Python 2.5, 2.6, 2.7 的标准库和类似 Django 的项目,只需要3分钟的样子。我惊喜的发现能够检索到的名字比第一版多很多。界面还算比较友好吧,但是有待提高。欢迎喜欢美工的人士参与合作。
因为 Python 语言的复杂性,而且由于我其实不是 Python 程序员,我相信 PySonar2 里面肯定还有一些细节没有照顾到(虽然最主要的部分是没问题的)。如果发现问题,请开启 GitHub 的 issue。
另外,同样的原理其实可以应用到所有的语言分析里面。在将来我希望开发出通用的代码分析器,能够处理多种语言。