2013-06-05 60 views
4

是否有任何靜態代碼分析工具發現JNI(方法)簽名字符串中的錯誤?例如,下面的代碼在語法上不正確的(缺少分號後全限定類名):JNI簽名代碼分析

(*env)->GetMethodID(env, someClassId, "aMethod","(ILfoo/bar/TheClass)V"); 

編輯:的代碼分析工具並不需要檢查foo的存在/酒吧/ theClass描述,但只能根據JNI規範檢查字符串是否有效。

這個問題的背景是,上面的代碼引發了分段錯誤。這總是一個令人討厭的調試情況,但在這種情況下,靜態分析應該非常簡單,可以節省大量時間。

+0

+1,好問題!但是,JNI API沒有方法將類名簽名作爲字符串檢索? (編輯:有:'javap') – fge

+0

@fge right,thanks。但是這對現有項目沒有幫助,創建新代碼時不方便。這最終使用複製/粘貼,並不證明代碼的正確性。 – Alexander

+0

上面的代碼不應該觸發分段錯誤。之後缺少錯誤檢查會導致這種情況。這就是你應該引導你注意的地方,單元測試對於JNI來說是必不可少的。 – EJP

回答

1

如果你只需要像在你的問題中的簽名是直接在GetMethodID調用內部的情況下靜態分析,你可以只編寫一個簡單的腳本,走在代碼文件,並找到所有GetMethodID/GetFieldID調用與一個正則表達式,然後驗證語法。

但是你總是可以使用的是-Xcheck:jniOracle/IBM)選項來調試這些問題。由於JVM完成了驗證,因此JNI調用將會變慢,但所需的調試工作量將顯着降低。

+0

這次我不想自己編寫它;-)我已經看到了-Xcheck:jni參數,這個參數非常有用,但我更喜歡靜態分析方法。不管怎麼說,還是要謝謝你。 – Alexander