FindBugs詳解


歡迎和大家交流技術相關問題:
郵箱: 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還是不理解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM