Infer:Facebook Java静态分析工具初探 - ImportNew
在这个例子中,我们能看到Infer怎么识别一个简单的空引用,并输出相关的解决信息,当问题解决并保存后,该类就能成功通过检查了。Infer完整的源代码可以在Github上找到。
增量 vs 非增量
Infer可以采用增量或非增量的方式运行。两者之间的不同点在于Infer是否删除已存在的结果目录。例如,在构建一个系统的时候,你可能想采用增量的方式运行,而执行单条编译命令时采用分增量的方式。如果要使用增量模式,只需增加�Cincremental标志。
Infer的局限性,Infer面临着和其他静态分析工具同样的问题。它存在错误的警告和bug丢失的问题,这个问题与你的应用如何编码,如何与第三方的库交互都有关系。另一个局限是存在检查范围的问题,因为它不能以动态的方式来进行测试。此外,对某些类型的bug检测还存在技术性限制,例如,迄今为止,Infer还不能测试数组越界或类型转换异常等问题。
这对Java开发者来说意味着什么呢?
Infer是为手机应用设计的,但是对普通的Java程序也能非常好的工作。它可以从构建工具(如Maven)开始运行,但是不一定完全符合你的工作流程。当然,问题在于是否值得用。
该问题的答案归结为你对静态分析工具的态度。Infer明显既不是第一个Java静态分析工具(例如,FindBugs是其中比较流行的一个),也不是第一个开源的这类工具。它仅仅是来自于Facebook的一个工具,但是,这可能给你带来固定的想法。既然是Facebook建立的,用于大量的apps,Infer自然被马上大规模使用了。
Infer还面临一些Java语言自身的限制。它不能处理Java的并发工具(Concurrency Utilities)或特性,比如计算。这些问题同样困扰着在其它静态分析工具,但是这点确实需要谨记。
工作流中的应用
静态分析工具通常在开发阶段使用。它们的本质是一个测试工具,是作为开发过程或CI/CD工作流中的一个步骤。它们不能代替调试器,因为它们工作的时候代码已经编译完成。它们也不能代替生产环境中的错误追踪器,因为整个主机的bug,只有当代码在生产环境暴露后,动态输入刚好命中时才会产生。但是在这两个环境之间存在一个空间,在这个地方,像Infer的工具是非常有用的。
例如,你可以将Infer做为一个开发环境(IDE)与生产环境(Takipi)中间的步骤。Infer在这种情景下,能帮助你在上线之前预先发现那些明显的bug。这能给你的用户防止一些问题,至少减少你Takipi面板上的问题,如果你使用Jenkins作为持续开发模型,你可以在每个版本发布的时候运行Infer,然后查看抛出的红色标记。
结论
Read full article from Infer:Facebook Java静态分析工具初探 - ImportNew
No comments:
Post a Comment