推断:Facebook的新Java静态分析工具
如何使用Facebook的Infer改善Java開(kāi)發(fā)工作流程?
如果您與技術(shù)話題保持緊密聯(lián)系(如果您正在閱讀此博客,我想您應(yīng)該這樣做),那么您可能聽(tīng)說(shuō)過(guò)Facebook 剛剛向公眾發(fā)布的新工具:推斷。 由于它來(lái)自Facebook,所以人們自然會(huì)感到好奇,因此我想看看該工具的含義以及它如何對(duì)Java開(kāi)發(fā)人員發(fā)揮作用。
新帖子:推斷:看一下Facebook的新Java靜態(tài)分析工具h(yuǎn)ttp://t.co/Dnp2xmSPQG pic.twitter.com/Dw9zZByMvB
— Takipi(@takipid) 2015年6月24日
什么是Facebook的推斷?
在評(píng)估其潛在用途之前,第一步當(dāng)然是要了解該工具的作用和用途。 Infer是Facebook最近以開(kāi)源形式發(fā)布的靜態(tài)分析工具。 專為iOS和Android使用而設(shè)計(jì),可用于在應(yīng)用程序發(fā)布之前檢測(cè)其錯(cuò)誤。 Facebook的工程師一直在將Infer用作其Facebook和Instagram應(yīng)用程序的內(nèi)部工具,因此已經(jīng)為大規(guī)模移動(dòng)環(huán)境進(jìn)行了很好的審查。
大致來(lái)說(shuō),它的工作方式是在編譯過(guò)程中掃描您的代碼,以查找某些預(yù)先設(shè)想的錯(cuò)誤和錯(cuò)誤情況。 捕獲有關(guān)編譯過(guò)程的信息后,它將對(duì)其進(jìn)行分析以尋找潛在的錯(cuò)誤。 如果找到任何內(nèi)容,它將在您的終端中將它們報(bào)告給您,并將它們寫入目錄文件。 它查找的錯(cuò)誤類型的示例包括空指針異常和資源泄漏。
設(shè)置Infer需要Python 2.7和Mac OS X或Linux。 要運(yùn)行它,您可以直接使用javac,也可以使用Maven或Gradle之類的構(gòu)建工具。 這是一個(gè)實(shí)際效果的示例:
在此示例中,我們可以看到Infer如何識(shí)別簡(jiǎn)單的空引用,如何輸出我們需要對(duì)其進(jìn)行修復(fù)的相關(guān)信息,以及如何在保存修復(fù)后成功傳遞該類。 可以在Github上找到Infer的完整源代碼。
增量與非增量
推斷可以增量或非增量方式運(yùn)行。 兩者之間的區(qū)別在于Infer是否將刪除現(xiàn)有的結(jié)果目錄。 因此,例如,您可能希望在使用構(gòu)建系統(tǒng)時(shí)以增量方式運(yùn)行,而在使用單個(gè)編譯器命令時(shí)以非增量方式運(yùn)行。 要允許增量模式,您只需要添加–incremental標(biāo)志。
就限制而言,Infer面臨著靜態(tài)分析工具的標(biāo)準(zhǔn)標(biāo)準(zhǔn)。 它可以根據(jù)應(yīng)用程序的編碼方式以及與第三方代碼的交互方式報(bào)告錯(cuò)誤警報(bào)和/或遺漏錯(cuò)誤。 它無(wú)法檢測(cè)的問(wèn)題范圍也很有限,因?yàn)樗鼰o(wú)法以動(dòng)態(tài)方式測(cè)試您的代碼。 它測(cè)試的錯(cuò)誤類型也有技術(shù)限制。 例如,Infer今天不測(cè)試數(shù)組邊界錯(cuò)誤或強(qiáng)制轉(zhuǎn)換異常。
這對(duì)Java開(kāi)發(fā)人員意味著什么?
Infer專為移動(dòng)用途而設(shè)計(jì),但對(duì)于純Java而言也非常適用。 由于可以從Maven之類的構(gòu)建工具運(yùn)行它,因此將其適應(yīng)您的工作流程并非易事。 當(dāng)然,問(wèn)題是它是否值得使用。
該問(wèn)題的答案取決于您對(duì)靜態(tài)分析工具的立場(chǎng)。 顯然,Infer并不是第一個(gè)可用于Java的靜態(tài)分析工具(例如, FindBugs是一種流行的工具),也不是唯一的開(kāi)源工具。 但是,它是唯一來(lái)自Facebook的網(wǎng)站,它可能會(huì)隨身攜帶一定的緩存。 隨著Facebook在其巨型應(yīng)用程序上的廣泛使用,Infer已受到大規(guī)模抨擊。
但是,Infer面對(duì)Java的一些語(yǔ)言限制。 它無(wú)法處理Java的并發(fā)實(shí)用程序或諸如算術(shù)之類的功能。 其中一些問(wèn)題對(duì)于其他靜態(tài)分析工具也同樣很麻煩,但值得牢記。
工作流程示例
靜態(tài)分析工具通常適合在開(kāi)發(fā)的中間階段。 實(shí)際上,它們是開(kāi)發(fā)過(guò)程的過(guò)渡步驟或作為CI / CD工作流一部分的測(cè)試工具。 他們無(wú)法替換開(kāi)發(fā)人員中的調(diào)試器,因?yàn)楸仨殞?duì)其進(jìn)行編譯才能正常工作,并且它們不能替換生產(chǎn)中的錯(cuò)誤跟蹤器,因?yàn)橹挥挟?dāng)代碼進(jìn)入生產(chǎn)環(huán)境并暴露于動(dòng)態(tài)環(huán)境后,才會(huì)出現(xiàn)大量錯(cuò)誤。輸入。 但是,在這兩種環(huán)境之間有一個(gè)空間,可以使用像Infer這樣的工具。
例如,您可以選擇將Infer作為中間步驟,將其與開(kāi)發(fā)環(huán)境選擇的IDE結(jié)合使用,并將Takipi用于生產(chǎn)環(huán)境。 在這種情況下,Infer可以幫助您在生產(chǎn)之前預(yù)先捕獲一些明顯的錯(cuò)誤。 這可以為您的用戶避免一些問(wèn)題,或者至少可以減少Takipi儀表板中的某些條目。 或者,如果您正在使用Jenkins運(yùn)行連續(xù)部署模型,則可以在每次發(fā)布推送后運(yùn)行Infer,以查看是否有新的事物引發(fā)明顯的危險(xiǎn)信號(hào)。
結(jié)論
當(dāng)像Facebook這樣的公司發(fā)布與Java兼容的開(kāi)源工具時(shí),值得一看。 Infer不是專門為Java構(gòu)建的,但是它仍可用于Java應(yīng)用程序中的靜態(tài)代碼分析。 它有一定的局限性,但也有一些很好的潛在用途,并且在將來(lái)應(yīng)該會(huì)繼續(xù)改進(jìn)。 如果您嘗試使用它,請(qǐng)讓我知道您在評(píng)論中的想法。
使用正確的工具對(duì)于成功至關(guān)重要,要確保在代碼交付生產(chǎn)時(shí)被覆蓋,請(qǐng)查看生產(chǎn)工具權(quán)威指南中的警報(bào)工具一章 。
翻譯自: https://www.javacodegeeks.com/2015/06/infer-a-look-into-facebooks-new-java-static-analysis-tool.html
總結(jié)
以上是生活随笔為你收集整理的推断:Facebook的新Java静态分析工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 长城信息长城电脑(长城电脑软件)
- 下一篇: JavaOne 2015 –提交的技巧和