歡迎和大家交流技術相關問題:
郵箱: jiangxinnju@163.com
博客園地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnju
Find bugs誤報告警的消除方法
背景介紹
在java工程中,Find bugs的靜態檢查能夠幫助我們挖掘出代碼可能存在的缺陷。在我實際使用的過程中,也確實發現了兩處由於“缺少else分支”導致“引入未初始化對象”的錯誤。與之相對應的是,通過Find bugs也發現四處對象中使用靜態成員導致Find bugs告警的情況。通過仔細閱讀和分析代碼邏輯,可以確認代碼本身沒有問題,這個是屬於Find bugs誤報的情況。既然我們打算使用Find bugs來做代碼的靜態檢查,那么就有必要保持一個干凈的代碼環境,這里面沒有任何的Find bugs告警。如果確定是代碼問題,毫無疑問需要馬上糾正。如果確認是Find bugs誤報,也應該進行消除,以便后續的檢查能夠基於一個干凈的環境,同樣的誤報不需要反復確認。Find bugs告警誤報的消除非常容易,只需要在兩個級別(類級別和方法進行)加上Find bugs的注解就可以消除。這里建議誤報消除盡量在方法級別上進行,以控制誤報消除的范圍,最大限度放置將真正的代碼問題也作為誤報給隱藏掉了。
方法
- 在工程添加注解依賴的jar包:使用Find bugs注解需要用到兩個jar包,annotations.jar和jsr305.jar。在eclipse中裝完Find bugs插件后,在eclipse目錄下可以找到這兩個jar包文件。
- 添加注解:在疑問代碼所在的類或者方法前面添加注解。其中,value的值就是前面提到的find bugs告警信息中的模式,因為value是一個數組,所以可以同時添加多個模式。justification的值是一句描述信息,你可以理解為是這條注解的注釋,內容可以是任意的。
@edu.umd.cs.findbugs.annotations
SuppressWarnings(value={"NM_CONFUSING"}, justification="remove findbugs")
- 重新運行Find bugs進行檢查:添加完注解后,接下來應該重新運行find bugs工具進行檢查,以確定誤報已經被消除。
MS: Field should be package protected (MS_PKGPROTECT)
A mutable static field could be changed by malicious code or by accident. The field could be made package protected to avoid this vulnerability.
我這樣定義了多個數組,均使用了 public final static 修飾符:
public final static double[][][] Y_MIN_SCOPE=
{
{{-120, -25}},
{{0, 254}},
{{0, 254}},
{{0, 254}}
};
public final static double[] GRID_HEIGHT = {1,1,1,1};
public final static String[][] TAG_NAMES=
{
{"RSRQ(dB)","RSRP(dBm)"},
{"TA(16*Ts)","UE TxPower(dBm)"},
{"TA(16*Ts)","RSRP(dBm)"},
{"TA(16*Ts)","RSRQ(dB)"}
};
findbugs給的修改提示是:
In LTE3DConstant
Field LTE3DConstant.Y_MIN_SCOPE
At LTE3DConstant.java:[line 53]
Y_MIN_SCOPE should be package protected
Bug Type: MS_PKGPROTECT
Bug Category:MALICIOUS_CODE (Malicious code vulnerability)
Source File:
Line:53
修改成這樣就不報錯了。
protected final double[][][] Y_MIN_SCOPE=
{
{{-120, -25}},
{{0, 254}},
{{0, 254}},
{{0, 254}}
};
可能原因是因為其它地方沒有使用到這個類的變量,所以最好將public改成protected,但是為什么要去掉static還是不理解。