[转]Eclipse插件开发之FindBugs插件
上一篇 / 下一篇 2009-09-05 12:40:23 / 个人分类:其它
FindBugs
|Vyl4I$y K5z:]v051Testing软件测试网,OS YO5]6W6o \FW:a
是一个在java程序中查找bug的程序,它查找bug模式的实例,也就是可能出错的代码实例,注意FIndBugs是检查java字节码,也就是*.claSS文件。
6hpH4O"_X0 其实准确的说,它是寻找代码缺陷的,很多我们写的不好的地方,可以优化的地方,它都能检查出来。例如:未关闭的数据库连接,缺少必要的nullcHEck,多余的nullcHEck,多余的if后置条件,相同的条件分支,重复的代码块,错误的使用了"",建议使用STringBuffer代替字符串连加等等。而且我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类,属于高级技巧)。51Testing软件测试网t*J+M{$Nq6z
一、安装方法
+Hb M4F @7C6jN0 详情见:http://FIndBugs.cs.umd.edu/eclipse
5eUxrbm6R0 If you have previously inSTalled a version of tHE FIndBugspluginprior to mid-May, 2006, tHEn you should remove it FIrST.Simplyremove tHE DE.tt.FIndBugs_0.0.n diRECtory from Eclipse"spluginsdiRECtory.
c G%B{B'y~2S0 To inSTall tHE FIndBugs plugin:51Testing软件测试网/F g^5S/b-ZSr~
1. In Eclipse, click on HElp -> Software Update -> FIndandInSTall...51Testing软件测试网v6Wt.OX"@Da2c
2. Choose tHE Search for new features to inSTall option, andclickNext.51Testing软件测试网K[jxpS Sv
3. Click New Remote Site.
hxmsy1y,~1Wy l#A0 4. Enter tHE following:
&[,x l"P*]$I&X0 * Name: FIndBugs update site
`3w-j5d7h/zN6d'p0 * URL: one of tHE following (Note: No FInal slash on tHE url)
2N#{r k+m9Y4rN0 o http://FIndBugs.cs.umd.edu/eclipse for ofFICIal releases51Testing软件测试网qte`X@ h
o http://FIndBugs.cs.umd.edu/eclipse-candidate forcandidatereleases and ofFICIal releases51Testing软件测试网*]!NN+K:N |
o http://FIndBugs.cs.umd.edu/eclipse-daily for allreleases,inculding DEvelopmental ones and click OK.
g3A,Hl8~)E0 5. "FIndBugs update site" should appear unDEr Sites to incluDEinsearch.
7A(_sCEOJ0 Click tHE cHEckbox next to it to select it, and click FInish.51Testing软件测试网%D/F(]X:DN*rI/j
6. You should see FIndBugs Feature unDEr Select featurestoinSTall.51Testing软件测试网ux5FF(c6[FUA
(You may have to click on one or two triangles to make itvisiblein tHE tree.)
,ql U%Vfqn0 Select tHE cHEckbox next to it and click next.51Testing软件测试网@!Cbe?\s
7. Select tHE I accept option to accept tHE license andclickNext.51Testing软件测试网o/?X7J0Qo?
8. Make sure tHE location is corRECt wHEre you"re inSTallingit.THE DEfault (your workspace) should be FIne. Click FInish.
:U_/h\ s%i,js+B0 9. THE plugin is Not digitally signed. Go aHEad and inSTallitanyway.51Testing软件测试网 e\3`B1k
二、使用方法
X9Mu;zHk [j0 本文主要介绍在Eclipse中使用的情况51Testing软件测试网R}K:?#A8a'@s
FindBugs51Testing软件测试网5^i0Rx8r[v KQ
是一个可以在Java程序中发现Bugs的程序。
$^D g1tz`b0 它是专门用来寻找处于“Bug Patterns”列表中的代码的。51Testing软件测试网0vl8M Aa3zW!`0w
Bug Patterns指很有可能是错误的代码的实例。51Testing软件测试网%};FFx*s,z
打开Bug DEtails视图
Q"O7b!h(t:P#hxl T0 Windows => Show View => OtHEr… => FIndBugs=>BugDEtails51Testing软件测试网#Dy?bJ
51Testing软件测试网)B%p(U9`d x;h2q
在PackageExplorer或Navigator视图中,选中你的Java项目,右键,可以看到“FIndBugs”菜单项,子菜单项里有“FIndBugs”和“Clear Bug Markers”两项内容,如下图所示:
1`U&f7v^0
j+i@Q*n0 我们建立一个简单的测试文件TeST.java 内容如下:
2hGOc,V%\'^0 public claSS TeST private STring name; public STringgetName()return name; public void setName(STring name) this.name =name;51Testing软件测试网0f-ON)O?;JS,S
我们点中“FInd Bugs”,运行时会出现如下进度框:51Testing软件测试网'd P`4`,w
运行结束后可以在ProbleMS中看到增加了如下的警告信息内容51Testing软件测试网+y \ |5Bo6c
FindBugs51Testing软件测试网d+q^hZ+h9ZW
运行后的警告信息内容不仅在ProbleMS视图中显示,而且将标记在源代码标记框中,在源代码编辑器中我们可以看到警告标识,如下图:
| y'L D~D9xy!~0
/kj-Y$O!|0
当光标指向你的警告信息的代码上面时,就会有相应的错误提示信息,与Eclipse本身的错误或警告信息提示类似。
Ejp6Y;SF*Gi0
h;p:Tw`0 选中ProbleMS视图里出现的相应问题,就会在代码编辑器里切换到相应的代码上去,方便根据相应的提示信息进行代码的修改。51Testing软件测试网:\ w^ Rvi
51Testing软件测试网3z(xI8z^0r&A;h EE
在ProbleMS视图里,选中相应的问题条目,右键,在弹出的菜单中,可以看到“Show BugDEtails”,如下图所示:
)z)RI7BJ`7h7T t051Testing软件测试网'@Z"tLUEQ1g2s
点中它,会切换到Bug DEtails视图上去,显示更加详细的提示信息。51Testing软件测试网/o$WR/f#D,G6]
51Testing软件测试网%j `%nL yA!_K
当然,在代码编辑窗口中,点击带有警告提示信息的图标时,也会自动切换到BudDEtails窗口去,查看详细的警告信息,如下图所示。51Testing软件测试网'l0J&~!Y(}.t1Ae
;{s6|%i5?rM0
根据这里详细的信息,你可以得到FIndBugs为什么会对你的代码报警告信息,及相应的处理办法,根据它的提示,你可以快速方便地进行代码修改。51Testing软件测试网m8eC3iH$S'n8T-g D
-~gP:A\}J0
根据提示,我们将代码修改成如下,再运行就不会报有警告信息了。51Testing软件测试网(Jy!wYxa
51Testing软件测试网G7g$@!s/y%R9lC
public claSS TeST private STring name; public STringgetName()STring temp = name; return temp; public voidsetName(STring name)STring temp = name; this.name = temp;
*q#U5r'Lh!Ler$f0 配置51Testing软件测试网,lw7D:dFe+D
FindBugs
;U#?9]2I#F:E/rX0 可以配置的信息包括如上图所示的四个选项的相关设置:51Testing软件测试网n C#Y]"j
1. Run FIndBugs Automatically开关
uZ6yb2p0 当此项选中后,FIndBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FIndBugs就会运行,并将相应的信息显示出来。51Testing软件测试网8B c e.`Y tC?
当此项没有选中,你只能每次在需要的时候自己去运行FIndBugs来检查你的代码。
t x*^T-Fv9nP!](b0 2. Minimum priority to report选择项51Testing软件测试网4E7mz~#b F,zp
这个选择项是让你选择哪个级别的信息进行显示,有Low、Medium、High三个选择项可以选择,很类似于Log4J的级别设置啦。比如:
n2wex)f6}eR(@t0id0 你选择了High选择项,那么只有是High级别的提示信息才会被显示。51Testing软件测试网7^ r'|G)o~5|Q2`
你选择了Medium选择项,那么只有是Medium和High级别的提示信息才会被显示。
S3~ [7?ZY~#B[Z0 你选择了Low选择项,那么所有级别的提示信息都会被显示。
/dh$m-hHd`#H9r0Y0 3. Enable bug categories选择项51Testing软件测试网 UzF3qJp~
在这里是一些显示Bug分类的选择:51Testing软件测试网+~eH]`^:Rn
Correctness51Testing软件测试网d@d.?r7V"QNp#yR`
关于代码正确性相关方面的
f+Cy |8T0 Performance
)d'A}i2h$m{e]0 关于代码性能相关方面的
U.X.GGU6N0 Internationalization51Testing软件测试网Le&vO$s8Y
关于代码国际化相关方面的51Testing软件测试网h \ol)o-b9ba"}
Multithreaded correctness51Testing软件测试网AJ!c&Gj.tn
关于代码多线程正确性相关方面的51Testing软件测试网;C1qX:s DP2K$o/W
ST
5o9v0p h.k^0 yle关于代码样式相关方面的51Testing软件测试网]*fO3n"Q ~u
Malicious code vulnerability51Testing软件测试网^IG4f/?Y
关于恶意破坏代码相关方面的
%}j(P3^K+U0 比如:如果你把STyle的检查框去掉不选择中它,那么与STyle分类相关的警告信息就不会显示了。其它的类似。
%KGD^EW:Xw"M0 4. Select bug patterns to cHEck for选择项51Testing软件测试网5b6P%S9PwS
在这里你可以选择所要进行检查的相关的Bug Pattern条目
W+h!s6|L-OR*R0 可以从Bug coDEs、DEtectorname、DEtectorDEtion中看到相应的是要检查哪些方面的内容,你可以根据需要选择或去掉相应的 检查条件。
-X+ym v/RC]0 三、详细说明51Testing软件测试网3I2J:p-D:u[k
FindBugs
+[N8Py.Y,Hl)t0 是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。FIndBugs自带检测器,其中有60余种Badpractice,80余种CorRECtneSS,1种INTernationalization,12种MaliCIouscoDEvulnerability,27种MultithreaDEdCorRECtneSS,23种Performance,43种Dodgy。51Testing软件测试网sz&{!rlV@2|%R$s i
Bad practice51Testing软件测试网Y#BJN4Y,z}u
坏的实践
!n{.L!H*v'^&Vz0 一些不好的实践,下面列举几个:51Testing软件测试网^i2Q`;c"C s
HE
y;n$J MZ;T4X2G(|:u%bo0 :51Testing软件测试网MC*gR#AQ k%u
类定义了equals(),却没有hashCoDE();或类定义了equals(),却使用51Testing软件测试网'G4M.d+]7c$b7n
t.hashCoDE();或类定义了hashCoDE(),却没有equals();或类定义了hashCoDE(),却使用t.equals();类继承了equals(),却使用t.hashCoDE()。
Dm~C"~0 SQL
uM!X8~K;x f0 :51Testing软件测试网:Nh,ac8}+V#{X)x2GD
ST
G a*vJ|?rW0 atement 的execute方法调用了非常量的字符串;或PreparedSTatement是由一个非常量的字符串产生。
2~Ofor8M8M#L0 DE51Testing软件测试网"K,aC,[%{6q
:51Testing软件测试网0z QP-@S]'^.]A^J%A
方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。51Testing软件测试网i`'x Fe%})y6G?0]
Correctness
.X-y;D^wa T `'Sr0 一般的正确性问题
_;AMqK3`0 可能导致错误的代码,下面列举几个:51Testing软件测试网$HI-c IDT)U
NP
&w;[3L1?0T0 :51Testing软件测试网.t&Im h2D&PeNU t)N
空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。
2\ gwT:F`7~s0 Nm
`_:a3\M]PK*u0 :51Testing软件测试网?{ }-\ddV
类定义了hashcoDE()方法,但实际上并未覆盖父类t的hashCoDE();类定义了toSTring()方法,但实际上并未覆盖父类t的toSTring();很明显的方法和构造器混淆;方法名容易混淆。51Testing软件测试网-I4g+u(i0u5J*S
SQL
%l\Lr"S)W0 :
6l/vS0Liv)P&b0 方法尝试访问一个Prepared STatement的0索引;方法尝试访问一个ResultSet的0索引。
:MPEQ_ {~+pg0 UwF51Testing软件测试网Z.KvB%Ve6s
:
Nq"WTI}os0 所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。
+eupk%BA h3WKd0 Internationalization
@8Po}!H4k+}"J7V\f0 国际化51Testing软件测试网+|;KP+V3_(}
当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。51Testing软件测试网9XKjJ4f:k2z
Malicious code vulnerability51Testing软件测试网 O2I cys
可能受到的恶意攻击
Ug+d@u{3Mn~$K0 如果代码公开,可能受到恶意攻击的代码,下面列举几个:
:U4|:{UHYjtc0 FI51Testing软件测试网4|r L}4n4[
:51Testing软件测试网+A$t`5?Z F;@Y3q!s^
一个类的FInalize()应该是protected,而不是public的。
"B9fpxI {(iL+C d9RN+@0 MS51Testing软件测试网\Y]O-_5c
:
_[0X#f YIa0 属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。
#UXie'Q)n.J/O0 Multithreaded correctness
A4l,Xn4N,vM,H%b0 多线程的正确性
,smko[3\`|U5o2G~\ZN0 多线程编程时,可能导致错误的代码,下面列举几个:51Testing软件测试网9IgT5pu A[a#C
ESync
L _2@4O$rJ,b0 :51Testing软件测试网.XB&YQ*s$jD
空的同步块,很难被正确使用。
6i sp%Q9C0 MWN51Testing软件测试网R%Asz-{[/P}
:51Testing软件测试网,Mlv0q-C"T Y"b8J@]a
错误使用Notify(),可能导致IllegalMonitorSTateException异常;或错误的51Testing软件测试网-e'J m9Pu1v$r-P:E"K
使用wait()。
"vl3^ Q8x ?0 No
z9HL-w6U!`7Hb0 :
:x2h wKhN6L,X S&H0 使用Notify()而不是NotifyAll(),只是唤醒一个线程而不是所有等待的线程。
NLW]P:K)Q}o0 SC
Yd,sdX{{h0 :
4i%u2n LW$h2r6OA0 构造器调用了Thread.STart(),当该类被继承可能会导致错误。
0[s0? {+`#zI0 Performance51Testing软件测试网,u}\'N._ f&]
性能问题51Testing软件测试网0EB1gu x f7Mk
可能导致性能不佳的代码,下面列举几个:
_-I-H`L2O8z T9N3U0 DM51Testing软件测试网F I @*G vS/[0?5~.?
:
!a@6}!UYX$}0 INT51Testing软件测试网&f:^ e3LPf
eger.toSTring(1)代替newINTeger(1).toSTring();方法调用了低效的float的构造器,应该用静态的valueOf方法。
\c"VVG)\)}%[ Zc0 SIC51Testing软件测试网-aI)e a Y N'm)Du
:
m-jx9EZyPdtu0 如果一个内部类想在更广泛的地方被引用,它应该声明为STatic。
Na5p6MZ yu h9p0 SS51Testing软件测试网~oU$VIb,e/}so
:
D gA-S&oR0 如果一个实例属性不被读取,考虑声明为STatic。
J7K)[6OH!e;}0 UrF51Testing软件测试网#]#?:z3?r-f7E
:
9a_&A ~RlkR0 如果一个属性从没有被read,考虑从类中去掉。51Testing软件测试网;zs Lv&G4a
UuF51Testing软件测试网zd"n6Y;y\!i*w~pj5U
:51Testing软件测试网l"Q f,y6c fC-WXf
如果一个属性从没有被使用,考虑从类中去掉。51Testing软件测试网:{_B"@3g [S`n
Dodgy51Testing软件测试网e0Hknmp
危险的
8x{-Io;GH"k-d0 具有潜在危险的代码,可能运行期产生错误,下面列举几个:51Testing软件测试网 Xz^P)^LN[
CI
d*m$t5g D~0 :51Testing软件测试网L'K%ZF"~U*Q;M6a+f
类声明为FInal但声明了protected的属性。
M]*w{^m8vhX0 DLS51Testing软件测试网QZ M Wk;Ko_ x-q
:51Testing软件测试网|YQNy ose
对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。
s4bG$nv*@ d0 ICAST51Testing软件测试网%O[VP X5J
:
:a8}z9[,H/b[0 整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。
g~4C;D8JB [w;d^0 INT
3zy0Wy/|A0 :
Z8@W`3JV%i@ U*_&w0 没必要的整型数字比较,如X <= INTeger.MAX_VALUE。
Ja9r\Q0 NP51Testing软件测试网T)XFNx_%YI(K
:
w%t(q1}FVoe._'H0 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。
u2aA5[7k0I4s3y{T0 REC51Testing软件测试网m;Jz8M8haPb
:51Testing软件测试网t0W#R@sQQ
直接捕获Exception,而实际上可能是RuntimeException。51Testing软件测试网\~ N7lV C)S I
ST51Testing软件测试网!NR"rLM%U v0v&T1~
:
5@CT3}2E-ee0 从实例方法里直接修改类变量,即STatic属性。51Testing软件测试网 i"xX2cx#e D$Yl
总结51Testing软件测试网$mr0K A~!S,e
此插件的功能很不错,可以帮助我们提升Java代码的编写能力,写出更加安全可靠的代码。建议使用或加在Ant里进行持续构建。
0_vN8jZ O*^&a0 现在,你可以马上拿出你已经开发的一个项目,检查一下你的代码有没有问题了。51Testing软件测试网*u$PUG}O/Ueu
编辑推荐
3G;O2}\l)\-r0 Ubuntu安装Eclipse-SDK-3.3小结
b4M#Z n6N#IY3fFU0 Eclipse插件jINTo资源配置文件51Testing软件测试网)w{ E9fLN
Eclipse启动参数大全
sR8] clB4hl:c$L[0 深入浅出Eclipse RCP(1):HEllo RCP
X2D.GH0l.wD0 Eclipse自动补全增强
|Vyl4I$y K5z:]v051Testing软件测试网,OS YO5]6W6o \FW:a
是一个在java程序中查找bug的程序,它查找bug模式的实例,也就是可能出错的代码实例,注意FIndBugs是检查java字节码,也就是*.claSS文件。
6hpH4O"_X0 其实准确的说,它是寻找代码缺陷的,很多我们写的不好的地方,可以优化的地方,它都能检查出来。例如:未关闭的数据库连接,缺少必要的nullcHEck,多余的nullcHEck,多余的if后置条件,相同的条件分支,重复的代码块,错误的使用了"",建议使用STringBuffer代替字符串连加等等。而且我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类,属于高级技巧)。51Testing软件测试网t*J+M{$Nq6z
一、安装方法
+Hb M4F @7C6jN0 详情见:http://FIndBugs.cs.umd.edu/eclipse
5eUxrbm6R0 If you have previously inSTalled a version of tHE FIndBugspluginprior to mid-May, 2006, tHEn you should remove it FIrST.Simplyremove tHE DE.tt.FIndBugs_0.0.n diRECtory from Eclipse"spluginsdiRECtory.
c G%B{B'y~2S0 To inSTall tHE FIndBugs plugin:51Testing软件测试网/F g^5S/b-ZSr~
1. In Eclipse, click on HElp -> Software Update -> FIndandInSTall...51Testing软件测试网v6Wt.OX"@Da2c
2. Choose tHE Search for new features to inSTall option, andclickNext.51Testing软件测试网K[jxpS Sv
3. Click New Remote Site.
hxmsy1y,~1Wy l#A0 4. Enter tHE following:
&[,x l"P*]$I&X0 * Name: FIndBugs update site
`3w-j5d7h/zN6d'p0 * URL: one of tHE following (Note: No FInal slash on tHE url)
2N#{r k+m9Y4rN0 o http://FIndBugs.cs.umd.edu/eclipse for ofFICIal releases51Testing软件测试网qte`X@ h
o http://FIndBugs.cs.umd.edu/eclipse-candidate forcandidatereleases and ofFICIal releases51Testing软件测试网*]!NN+K:N |
o http://FIndBugs.cs.umd.edu/eclipse-daily for allreleases,inculding DEvelopmental ones and click OK.
g3A,Hl8~)E0 5. "FIndBugs update site" should appear unDEr Sites to incluDEinsearch.
7A(_sCEOJ0 Click tHE cHEckbox next to it to select it, and click FInish.51Testing软件测试网%D/F(]X:DN*rI/j
6. You should see FIndBugs Feature unDEr Select featurestoinSTall.51Testing软件测试网ux5FF(c6[FUA
(You may have to click on one or two triangles to make itvisiblein tHE tree.)
,ql U%Vfqn0 Select tHE cHEckbox next to it and click next.51Testing软件测试网@!Cbe?\s
7. Select tHE I accept option to accept tHE license andclickNext.51Testing软件测试网o/?X7J0Qo?
8. Make sure tHE location is corRECt wHEre you"re inSTallingit.THE DEfault (your workspace) should be FIne. Click FInish.
:U_/h\ s%i,js+B0 9. THE plugin is Not digitally signed. Go aHEad and inSTallitanyway.51Testing软件测试网 e\3`B1k
二、使用方法
X9Mu;zHk [j0 本文主要介绍在Eclipse中使用的情况51Testing软件测试网R}K:?#A8a'@s
FindBugs51Testing软件测试网5^i0Rx8r[v KQ
是一个可以在Java程序中发现Bugs的程序。
$^D g1tz`b0 它是专门用来寻找处于“Bug Patterns”列表中的代码的。51Testing软件测试网0vl8M Aa3zW!`0w
Bug Patterns指很有可能是错误的代码的实例。51Testing软件测试网%};FFx*s,z
打开Bug DEtails视图
Q"O7b!h(t:P#hxl T0 Windows => Show View => OtHEr… => FIndBugs=>BugDEtails51Testing软件测试网#Dy?bJ
51Testing软件测试网)B%p(U9`d x;h2q
1`U&f7v^0
j+i@Q*n0 我们建立一个简单的测试文件TeST.java 内容如下:
2hGOc,V%\'^0 public claSS TeST private STring name; public STringgetName()return name; public void setName(STring name) this.name =name;51Testing软件测试网0f-ON)O?;JS,S
我们点中“FInd Bugs”,运行时会出现如下进度框:51Testing软件测试网'd P`4`,w
运行结束后可以在ProbleMS中看到增加了如下的警告信息内容51Testing软件测试网+y \ |5Bo6c
FindBugs51Testing软件测试网d+q^hZ+h9ZW
运行后的警告信息内容不仅在ProbleMS视图中显示,而且将标记在源代码标记框中,在源代码编辑器中我们可以看到警告标识,如下图:
| y'L D~D9xy!~0
/kj-Y$O!|0
Ejp6Y;SF*Gi0
h;p:Tw`0 选中ProbleMS视图里出现的相应问题,就会在代码编辑器里切换到相应的代码上去,方便根据相应的提示信息进行代码的修改。51Testing软件测试网:\ w^ Rvi
51Testing软件测试网3z(xI8z^0r&A;h EE
)z)RI7BJ`7h7T t051Testing软件测试网'@Z"tLUEQ1g2s
51Testing软件测试网%j `%nL yA!_K
当然,在代码编辑窗口中,点击带有警告提示信息的图标时,也会自动切换到BudDEtails窗口去,查看详细的警告信息,如下图所示。51Testing软件测试网'l0J&~!Y(}.t1Ae
;{s6|%i5?rM0
-~gP:A\}J0
51Testing软件测试网G7g$@!s/y%R9lC
public claSS TeST private STring name; public STringgetName()STring temp = name; return temp; public voidsetName(STring name)STring temp = name; this.name = temp;
*q#U5r'Lh!Ler$f0 配置51Testing软件测试网,lw7D:dFe+D
FindBugs
;U#?9]2I#F:E/rX0 可以配置的信息包括如上图所示的四个选项的相关设置:51Testing软件测试网n C#Y]"j
1. Run FIndBugs Automatically开关
uZ6yb2p0 当此项选中后,FIndBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FIndBugs就会运行,并将相应的信息显示出来。51Testing软件测试网8B c e.`Y tC?
当此项没有选中,你只能每次在需要的时候自己去运行FIndBugs来检查你的代码。
t x*^T-Fv9nP!](b0 2. Minimum priority to report选择项51Testing软件测试网4E7mz~#b F,zp
这个选择项是让你选择哪个级别的信息进行显示,有Low、Medium、High三个选择项可以选择,很类似于Log4J的级别设置啦。比如:
n2wex)f6}eR(@t0id0 你选择了High选择项,那么只有是High级别的提示信息才会被显示。51Testing软件测试网7^ r'|G)o~5|Q2`
你选择了Medium选择项,那么只有是Medium和High级别的提示信息才会被显示。
S3~ [7?ZY~#B[Z0 你选择了Low选择项,那么所有级别的提示信息都会被显示。
/dh$m-hHd`#H9r0Y0 3. Enable bug categories选择项51Testing软件测试网 UzF3qJp~
在这里是一些显示Bug分类的选择:51Testing软件测试网+~eH]`^:Rn
Correctness51Testing软件测试网d@d.?r7V"QNp#yR`
关于代码正确性相关方面的
f+Cy |8T0 Performance
)d'A}i2h$m{e]0 关于代码性能相关方面的
U.X.GGU6N0 Internationalization51Testing软件测试网Le&vO$s8Y
关于代码国际化相关方面的51Testing软件测试网h \ol)o-b9ba"}
Multithreaded correctness51Testing软件测试网AJ!c&Gj.tn
关于代码多线程正确性相关方面的51Testing软件测试网;C1qX:s DP2K$o/W
ST
5o9v0p h.k^0 yle关于代码样式相关方面的51Testing软件测试网]*fO3n"Q ~u
Malicious code vulnerability51Testing软件测试网^IG4f/?Y
关于恶意破坏代码相关方面的
%}j(P3^K+U0 比如:如果你把STyle的检查框去掉不选择中它,那么与STyle分类相关的警告信息就不会显示了。其它的类似。
%KGD^EW:Xw"M0 4. Select bug patterns to cHEck for选择项51Testing软件测试网5b6P%S9PwS
在这里你可以选择所要进行检查的相关的Bug Pattern条目
W+h!s6|L-OR*R0 可以从Bug coDEs、DEtectorname、DEtectorDEtion中看到相应的是要检查哪些方面的内容,你可以根据需要选择或去掉相应的 检查条件。
-X+ym v/RC]0 三、详细说明51Testing软件测试网3I2J:p-D:u[k
FindBugs
+[N8Py.Y,Hl)t0 是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。FIndBugs自带检测器,其中有60余种Badpractice,80余种CorRECtneSS,1种INTernationalization,12种MaliCIouscoDEvulnerability,27种MultithreaDEdCorRECtneSS,23种Performance,43种Dodgy。51Testing软件测试网sz&{!rlV@2|%R$s i
Bad practice51Testing软件测试网Y#BJN4Y,z}u
坏的实践
!n{.L!H*v'^&Vz0 一些不好的实践,下面列举几个:51Testing软件测试网^i2Q`;c"C s
HE
y;n$J MZ;T4X2G(|:u%bo0 :51Testing软件测试网MC*gR#AQ k%u
类定义了equals(),却没有hashCoDE();或类定义了equals(),却使用51Testing软件测试网'G4M.d+]7c$b7n
t.hashCoDE();或类定义了hashCoDE(),却没有equals();或类定义了hashCoDE(),却使用t.equals();类继承了equals(),却使用t.hashCoDE()。
Dm~C"~0 SQL
uM!X8~K;x f0 :51Testing软件测试网:Nh,ac8}+V#{X)x2GD
ST
G a*vJ|?rW0 atement 的execute方法调用了非常量的字符串;或PreparedSTatement是由一个非常量的字符串产生。
2~Ofor8M8M#L0 DE51Testing软件测试网"K,aC,[%{6q
:51Testing软件测试网0z QP-@S]'^.]A^J%A
方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。51Testing软件测试网i`'x Fe%})y6G?0]
Correctness
.X-y;D^wa T `'Sr0 一般的正确性问题
_;AMqK3`0 可能导致错误的代码,下面列举几个:51Testing软件测试网$HI-c IDT)U
NP
&w;[3L1?0T0 :51Testing软件测试网.t&Im h2D&PeNU t)N
空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。
2\ gwT:F`7~s0 Nm
`_:a3\M]PK*u0 :51Testing软件测试网?{ }-\ddV
类定义了hashcoDE()方法,但实际上并未覆盖父类t的hashCoDE();类定义了toSTring()方法,但实际上并未覆盖父类t的toSTring();很明显的方法和构造器混淆;方法名容易混淆。51Testing软件测试网-I4g+u(i0u5J*S
SQL
%l\Lr"S)W0 :
6l/vS0Liv)P&b0 方法尝试访问一个Prepared STatement的0索引;方法尝试访问一个ResultSet的0索引。
:MPEQ_ {~+pg0 UwF51Testing软件测试网Z.KvB%Ve6s
:
Nq"WTI}os0 所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。
+eupk%BA h3WKd0 Internationalization
@8Po}!H4k+}"J7V\f0 国际化51Testing软件测试网+|;KP+V3_(}
当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。51Testing软件测试网9XKjJ4f:k2z
Malicious code vulnerability51Testing软件测试网 O2I cys
可能受到的恶意攻击
Ug+d@u{3Mn~$K0 如果代码公开,可能受到恶意攻击的代码,下面列举几个:
:U4|:{UHYjtc0 FI51Testing软件测试网4|r L}4n4[
:51Testing软件测试网+A$t`5?Z F;@Y3q!s^
一个类的FInalize()应该是protected,而不是public的。
"B9fpxI {(iL+C d9RN+@0 MS51Testing软件测试网\Y]O-_5c
:
_[0X#f YIa0 属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。
#UXie'Q)n.J/O0 Multithreaded correctness
A4l,Xn4N,vM,H%b0 多线程的正确性
,smko[3\`|U5o2G~\ZN0 多线程编程时,可能导致错误的代码,下面列举几个:51Testing软件测试网9IgT5pu A[a#C
ESync
L _2@4O$rJ,b0 :51Testing软件测试网.XB&YQ*s$jD
空的同步块,很难被正确使用。
6i sp%Q9C0 MWN51Testing软件测试网R%Asz-{[/P}
:51Testing软件测试网,Mlv0q-C"T Y"b8J@]a
错误使用Notify(),可能导致IllegalMonitorSTateException异常;或错误的51Testing软件测试网-e'J m9Pu1v$r-P:E"K
使用wait()。
"vl3^ Q8x ?0 No
z9HL-w6U!`7Hb0 :
:x2h wKhN6L,X S&H0 使用Notify()而不是NotifyAll(),只是唤醒一个线程而不是所有等待的线程。
NLW]P:K)Q}o0 SC
Yd,sdX{{h0 :
4i%u2n LW$h2r6OA0 构造器调用了Thread.STart(),当该类被继承可能会导致错误。
0[s0? {+`#zI0 Performance51Testing软件测试网,u}\'N._ f&]
性能问题51Testing软件测试网0EB1gu x f7Mk
可能导致性能不佳的代码,下面列举几个:
_-I-H`L2O8z T9N3U0 DM51Testing软件测试网F I @*G vS/[0?5~.?
:
!a@6}!UYX$}0 INT51Testing软件测试网&f:^ e3LPf
eger.toSTring(1)代替newINTeger(1).toSTring();方法调用了低效的float的构造器,应该用静态的valueOf方法。
\c"VVG)\)}%[ Zc0 SIC51Testing软件测试网-aI)e a Y N'm)Du
:
m-jx9EZyPdtu0 如果一个内部类想在更广泛的地方被引用,它应该声明为STatic。
Na5p6MZ yu h9p0 SS51Testing软件测试网~oU$VIb,e/}so
:
D gA-S&oR0 如果一个实例属性不被读取,考虑声明为STatic。
J7K)[6OH!e;}0 UrF51Testing软件测试网#]#?:z3?r-f7E
:
9a_&A ~RlkR0 如果一个属性从没有被read,考虑从类中去掉。51Testing软件测试网;zs Lv&G4a
UuF51Testing软件测试网zd"n6Y;y\!i*w~pj5U
:51Testing软件测试网l"Q f,y6c fC-WXf
如果一个属性从没有被使用,考虑从类中去掉。51Testing软件测试网:{_B"@3g [S`n
Dodgy51Testing软件测试网e0Hknmp
危险的
8x{-Io;GH"k-d0 具有潜在危险的代码,可能运行期产生错误,下面列举几个:51Testing软件测试网 Xz^P)^LN[
CI
d*m$t5g D~0 :51Testing软件测试网L'K%ZF"~U*Q;M6a+f
类声明为FInal但声明了protected的属性。
M]*w{^m8vhX0 DLS51Testing软件测试网QZ M Wk;Ko_ x-q
:51Testing软件测试网|YQNy ose
对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。
s4bG$nv*@ d0 ICAST51Testing软件测试网%O[VP X5J
:
:a8}z9[,H/b[0 整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。
g~4C;D8JB [w;d^0 INT
3zy0Wy/|A0 :
Z8@W`3JV%i@ U*_&w0 没必要的整型数字比较,如X <= INTeger.MAX_VALUE。
Ja9r\Q0 NP51Testing软件测试网T)XFNx_%YI(K
:
w%t(q1}FVoe._'H0 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。
u2aA5[7k0I4s3y{T0 REC51Testing软件测试网m;Jz8M8haPb
:51Testing软件测试网t0W#R@sQQ
直接捕获Exception,而实际上可能是RuntimeException。51Testing软件测试网\~ N7lV C)S I
ST51Testing软件测试网!NR"rLM%U v0v&T1~
:
5@CT3}2E-ee0 从实例方法里直接修改类变量,即STatic属性。51Testing软件测试网 i"xX2cx#e D$Yl
总结51Testing软件测试网$mr0K A~!S,e
此插件的功能很不错,可以帮助我们提升Java代码的编写能力,写出更加安全可靠的代码。建议使用或加在Ant里进行持续构建。
0_vN8jZ O*^&a0 现在,你可以马上拿出你已经开发的一个项目,检查一下你的代码有没有问题了。51Testing软件测试网*u$PUG}O/Ueu
编辑推荐
3G;O2}\l)\-r0 Ubuntu安装Eclipse-SDK-3.3小结
b4M#Z n6N#IY3fFU0 Eclipse插件jINTo资源配置文件51Testing软件测试网)w{ E9fLN
Eclipse启动参数大全
sR8] clB4hl:c$L[0 深入浅出Eclipse RCP(1):HEllo RCP
X2D.GH0l.wD0 Eclipse自动补全增强
生活在互联网领域,从事WEB测试工作.
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | ||||||||
3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
10 | 11 | 12 | 13 | 14 | 15 | 16 | |||
17 | 18 | 19 | 20 | 21 | 22 | 23 | |||
24 | 25 | 26 | 27 | 28 | 29 | 30 | |||
31 |
我的存档
数据统计
- 访问量: 1690408
- 日志数: 556
- 图片数: 1
- 文件数: 3
- 书签数: 8
- 建立时间: 2007-06-08
- 更新时间: 2023-01-07