java自动推断类型
如何使用Facebook的Infer改善Java开发工作流程?
如果您与技术话题保持同步(如果您正在阅读此博客,我想您会这样做),那么您可能听说过Facebook 刚刚向公众发布的新工具:推断。 由于它来自Facebook,所以人们自然会感到好奇,因此我想看看该工具的含义以及它如何对Java开发人员发挥作用。
新帖:推断:考察Facebook的新Java静态分析工具http://t.co/Dnp2xmSPQG pic.twitter.com/Dw9zZByMvB
— Takipi(@takipid) 2015年6月24日
什么是Facebook的推断?
在评估其潜在用途之前,第一步当然是要了解该工具的作用和用途。 Infer是Facebook最近以开源形式发布的静态分析工具。 专为iOS和Android使用而设计,可用于在应用发布之前检测其错误。 Facebook的工程师一直在将Infer用作其Facebook和Instagram应用程序的内部工具,因此已经为大规模移动环境进行了很好的审查。
大致而言,它的工作方式是在编译过程中扫描您的代码,以查找某些预先设想的错误和错误情况。 捕获有关编译过程的信息后,它将对其进行分析以寻找潜在的错误。 如果找到任何内容,它将在您的终端中将它们报告给您,并将它们写入目录文件。 它查找的错误类型的示例包括空指针异常和资源泄漏。
设置Infer需要Python 2.7和Mac OS X或Linux。 要运行它,您可以直接使用javac,也可以使用Maven或Gradle之类的构建工具。 这是一个实际效果的示例:
在此示例中,我们可以看到Infer如何识别简单的null引用,如何输出我们需要对其进行修复的相关信息,以及如何在保存修复后成功传递该类。 可以在Github上找到Infer的完整源代码。
增量与非增量
推断可以增量或非增量方式运行。 两者之间的区别在于Infer是否将删除现有的结果目录。 因此,例如,您可能希望在使用构建系统时以增量方式运行,而在使用单个编译器命令时以非增量方式运行。 要允许增量模式,您只需要添加–incremental标志。
就限制而言,Infer面临静态分析工具的标准标准。 它可以根据应用程序的编码方式以及与第三方代码的交互方式报告错误警报和/或未命中的错误。 它无法检测的问题范围也很有限,因为它无法动态地测试您的代码。 它测试的错误类型也有技术限制。 例如,Infer今天不测试数组边界错误或强制转换异常。
这对Java开发人员意味着什么?
Infer专为移动使用而设计,但对于纯Java也非常适用。 由于可以从Maven之类的构建工具运行它,因此使其适应您的工作流程并非易事。 当然,问题是它是否值得使用。
该问题的答案取决于您对静态分析工具的立场。 显然,Infer并不是第一个可用于Java的静态分析工具(例如, FindBugs是一种流行的工具),也不是唯一的开源工具。 但是,它是唯一来自Facebook的网站,它可能会随身携带一定的缓存。 随着Facebook在其巨型应用程序上的广泛使用,Infer已受到大规模抨击。
但是,Infer面对Java的一些语言限制。 它无法处理Java的并发实用程序或诸如算术之类的功能。 其中的一些问题对于其他静态分析工具也很麻烦,但值得牢记。
工作流程示例
静态分析工具通常适合在开发的中间阶段。 实际上,它们是用于开发过程的过渡步骤或作为CI / CD工作流的一部分的测试工具。 他们无法替换开发人员中的调试器,因为必须对其进行编译才能工作,并且它们不能替换产品中的错误跟踪器,因为只有当代码进入生产环境并暴露于动态环境后,才会出现大量错误。输入。 但是在这两种环境之间有一定的空间,可以使用像Infer这样的工具。
例如,您可以选择将Infer用作中间步骤,将其与开发环境选择的IDE结合使用,并将Takipi用于生产环境。 在这种情况下,推断可以帮助您在生产之前预先捕获一些明显的错误。 这可以为您的用户避免一些问题,或者至少可以减少Takipi仪表板中的某些条目。 或者,如果您正在使用Jenkins运行连续部署模型,则可以在每次发布推送后运行Infer,以查看是否有新的事物引发明显的危险信号。
结论
当像Facebook这样的公司发布与Java兼容的开源工具时,值得一看。 Infer不是专门为Java构建的,但仍可用于Java应用程序中的静态代码分析。 它有一定的局限性,但也有一些很好的潜在用途,并且在将来应该会继续改进。 如果您尝试使用它,请让我知道您在评论中的想法。
使用正确的工具对于成功至关重要,要确保在代码交付生产时被覆盖,请查看生产工具权威指南中的警报工具一章 。
翻译自: https://www.javacodegeeks.com/2015/06/infer-a-look-into-facebooks-new-java-static-analysis-tool.html
java自动推断类型