當前位置:
首頁 > 最新 > 誤報案例-Android App 程序Cursor資源泄漏

誤報案例-Android App 程序Cursor資源泄漏

Android App 開發使用的API與一般Java程序不同。Klocwork工具針對這些API進行了特殊處理。儘管如此,仍有一些細節上的疏漏會造成一些誤報。不過Klocwork的調優手段也很不錯。本案例針對一則 Android App 針對Cursor 對象的處理誤報問題分析原因,給出調優方法。

【誤報現象】

看這個Android App的代碼分析結果:

報告中45行分配的資源對象 c 未能關閉造成資源泄露(ANDROID.RLK.SQLOBJ)。

但其實,在第54行,finally塊里,已經處理了對象 c 的關閉情況。

【原因分析】

經分析,c 對象是 Cursor 類型,Klocwork未能識別 Cursor.isClosed() 方法的行為。

【解決方法】

使用Klocwork java調優 jkb 方法,來補充Cursor.isClosed() 方法的行為,讓Klocwork懂得此方法的行為。

Cursor.isClosed() 方法,是判斷Cursor對象是否已經關閉,關閉狀態則返回 true,未關閉狀態則返回 false。

那麼,從Klocwork分析引擎的角度理解,如果是 isClosed(),則相當於對 ANDROID.RLK.SQLOBJ 缺陷的一個檢查 Check,即如果,isClose返回 true,則不會發生 ANDROID.RLK.SQLOBJ 缺陷。那麼,jkb就補充這部分的語義。

具體操作:

(1)創建一個文本文件 manual.jkb,名稱可以隨意,要求一定是 .jkb 後綴;

(2)編輯 manual.kb 的內容是:

package android.database;

public interface Cursor extends Closeable {

@Bind(ANDROID.RLK.SQLOBJ)

@CheckTrue("this") boolean isClosed();

}

這個寫法很簡單,我們從 Cursor 的聲明原型拷貝出來 package 行、Cursor 介面行,以及我們要補充的 isClosed() 的行,與Cursor 聲明保持一致。下圖是Cursor的聲明原型的內容:

然後,添加Klocwork的知識庫標記(帶@符號的部分),此例中說明如下:

@Bind(ANDROID.RLK.SQLOBJ) - 表示以下情況是針對ANDROID.RLK.SQLOBJ 類型的缺陷而編寫。

@CheckTrue("this") - 表示如果 isClosed() 方法如果返回 True,則不會再出現上面Bind 的 ANDROID.RLK.SQLOBJ 類型缺陷,因為已經關閉了。那麼,反而言之,如果isClosed() 返回的是 False,那麼就必須要執行Cursor 的關閉,否則出現 ANDROID.RLK.SQLOBJ 缺陷。這裡的 this 表示當前的類的對象,類似C++ 裡面的 this 指針。

(3)將上述文件寫完後保存。然後在分析環境中導入:

如果是 kwbuildproject 分析,則使用

kwadmin import-config

manual.jkb 導入,如果要導入到整個伺服器上,作為預設配置(對導入後新創建項目是預設配置),則:

kwadmin import-config workspace manual.jkb

然後,照常執行 kwbuildproject, kwadmin load 命令。

如果是桌面項目,則使用 kwcheck import manual.kb 導入,然後執行 kwcheck run -r 命令。

如果在ADT 裡面,則在這個位置導入manual.kb:

然後,重新執行分析。

使用此 jkb 調優後,誤報就會被消除。

當然,徹底的解決辦法還是期待 Klocwork 從引擎上來改進和解決,這隻能期待未來的版本了。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

懦弱的父母,別把責任推給孩子
3萬分的真相,你的偶像,不再年輕!

TAG:全球大搜羅 |