Infer:非死book Java靜態分析工具初探
怎么通過非死book的Infer來改善你的Java開發工作流程?
如果你保持對技術問題的持續關注(我假定你是這樣的,如果你正在讀這篇博客的話),你可能聽到非死book開放了一個新的工具:Infer。因為它來自非死book,大家自然都比較好奇,所以我很想看看該工具是什么東西?對Java開發者來說,能扮演什么角色?
非死book Infer是什么?
在使用之前,第一步當然是了解該工具是什么,能做什么。Infer是非死book最近開源的一個靜態分析工具。是為iOS和Android 設計的,它用于在app發布之前,發現其中的bug。非死book的工程師將Infer作為內部工具,應用在非死book和Instagram等 app上,所以它能夠很好的應用在大規模的移動環境中。
粗略的講,Infer的工作方式是在編譯期掃描你的代碼,預先發現bug和錯誤。從編譯過程中抓取信息后,就對該信息進行分析查找潛在的bug。如果有任何的發現,它就會向終端發送報告,并將問題記錄在一個目錄文件里。最典型的bug的例子就是查找空指針異常和資源泄露。
Infer的安裝需要Python 2.7及Mac OS X或Linux。可以直接通過javac或構建工具如Maven或Gradle來運行。在實踐中可以類似這樣:
在這個例子中,我們能看到Infer怎么識別一個簡單的空引用,并輸出相關的解決信息,當問題解決并保存后,該類就能成功通過檢查了。Infer完整的源代碼可以在Github上找到。
增量 vs 非增量
Infer可以采用增量或非增量的方式運行。兩者之間的不同點在于Infer是否刪除已存在的結果目錄。例如,在構建一個系統的時候,你可能想采用增量的方式運行,而執行單條編譯命令時采用分增量的方式。如果要使用增量模式,只需增加–incremental標志。
Infer的局限性,Infer面臨著和其他靜態分析工具同樣的問題。它存在錯誤的警告和bug丟失的問題,這個問題與你的應用如何編碼,如何與第三方的庫交互都有關系。另一個局限是存在檢查范圍的問題,因為它不能以動態的方式來進行測試。此外,對某些類型的bug檢測還存在技術性限制,例如,迄今為止,Infer還不能測試數組越界或類型轉換異常等問題。
這對Java開發者來說意味著什么呢?
Infer是為手機應用設計的,但是對普通的Java程序也能非常好的工作。它可以從構建工具(如Maven)開始運行,但是不一定完全符合你的工作流程。當然,問題在于是否值得用。
該問題的答案歸結為你對靜態分析工具的態度。Infer明顯既不是第一個Java靜態分析工具(例如,FindBugs是其中比較流行的一個),也不是第一個開源的這類工具。它僅僅是來自于非死book的一個工具,但是,這可能給你帶來固定的想法。既然是非死book建立的,用于大量的apps,Infer自然被馬上大規模使用了。
Infer還面臨一些Java語言自身的限制。它不能處理Java的并發工具(Concurrency Utilities)或特性,比如計算。這些問題同樣困擾著在其它靜態分析工具,但是這點確實需要謹記。
工作流中的應用
靜態分析工具通常在開發階段使用。它們的本質是一個測試工具,是作為開發過程或CI/CD工作流中的一個步驟。它們不能代替調試器,因為它們工作的時候代碼已經編譯完成。它們也不能代替生產環境中的錯誤追蹤器,因為整個主機的bug,只有當代碼在生產環境暴露后,動態輸入剛好命中時才會產生。但是在這兩個環境之間存在一個空間,在這個地方,像Infer的工具是非常有用的。
例如,你可以將Infer做為一個開發環境(IDE)與生產環境(Takipi)中間的步驟。Infer在這種情景下,能幫助你在上線之前預先發現那些明顯的bug。這能給你的用戶防止一些問題,至少減少你Takipi面板上的問題,如果你使用Jenkins作為持續開發模型,你可以在每個版本發布的時候運行Infer,然后查看拋出的紅色標記。
結論
當一個像非死book一樣的公司開源一個使用的很好的Java工具時,是值得我們去看一下的。Infer不是特意為Java設計的,但是它能對Java app做靜態代碼分析。雖然存在一些固有的局限性,但是也有很多優秀功能,還有一些特性需在將來進行確認。如果你使用了它,請在評論里讓我們知道你的看法。
使用正確的工具是成功的關鍵,在你的代碼發布的生產環境之前,確保所有的代碼都被覆蓋到了,查看 警告工具章節 獲取生產環境工具的權威指南。
原文鏈接: takipi 翻譯:ImportNew.com -paddx