[转]Eclipse插件开发之FindBugs插件
上一篇 / 下一篇 2009-09-05 12:40:23 / 个人分类:其它
FindBugs51Testing软件测试网{Tv1@H'y2B
51Testing软件测试网{] [ C~$~-}
是一个在java程序中查找bug的程序,它查找bug模式的实例,也就是可能出错的代码实例,注意FIndBugs是检查java字节码,也就是*.claSS文件。
Z)W1YG9@Or0 其实准确的说,它是寻找代码缺陷的,很多我们写的不好的地方,可以优化的地方,它都能检查出来。例如:未关闭的数据库连接,缺少必要的nullcHEck,多余的nullcHEck,多余的if后置条件,相同的条件分支,重复的代码块,错误的使用了"",建议使用STringBuffer代替字符串连加等等。而且我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类,属于高级技巧)。
[*h"Gc)Qz|d0 一、安装方法
#I*K,Uqg,nu7S0m)\0 详情见:http://FIndBugs.cs.umd.edu/eclipse
$fCL/t%f\G je0G0 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.
\A s4x#qR x0 To inSTall tHE FIndBugs plugin:
9T*dA0@QK ?0 1. In Eclipse, click on HElp -> Software Update -> FIndandInSTall...51Testing软件测试网2?Y0KUsq_:nI
2. Choose tHE Search for new features to inSTall option, andclickNext.
"Bq;|6A4Qz]@0 3. Click New Remote Site.
;`,V)@+wA [&{0 4. Enter tHE following:
D3^'e~m0 * Name: FIndBugs update site
H{A}m8bU+v4B7q0 * URL: one of tHE following (Note: No FInal slash on tHE url)
3?e{`y,c2u}!w0 o http://FIndBugs.cs.umd.edu/eclipse for ofFICIal releases51Testing软件测试网!`gaz0nU$c m!e
o http://FIndBugs.cs.umd.edu/eclipse-candidate forcandidatereleases and ofFICIal releases51Testing软件测试网&Y.DI(P3S$SK
o http://FIndBugs.cs.umd.edu/eclipse-daily for allreleases,inculding DEvelopmental ones and click OK.
RE iR ]q!k ?,yP0 5. "FIndBugs update site" should appear unDEr Sites to incluDEinsearch.
0Kc8c&j_0a5w0 Click tHE cHEckbox next to it to select it, and click FInish.
Z8M*]AzO\P"c0 6. You should see FIndBugs Feature unDEr Select featurestoinSTall.
lk5]/\4\q1g2\0 (You may have to click on one or two triangles to make itvisiblein tHE tree.)51Testing软件测试网i)p?+`F-h
Select tHE cHEckbox next to it and click next.
"RNO3ls,]0 7. Select tHE I accept option to accept tHE license andclickNext.51Testing软件测试网2G yO%f\)~#j `}+?
8. Make sure tHE location is corRECt wHEre you"re inSTallingit.THE DEfault (your workspace) should be FIne. Click FInish.
*jdh8N.k-S1~0 9. THE plugin is Not digitally signed. Go aHEad and inSTallitanyway.51Testing软件测试网8@%@"hNz
二、使用方法
2O)d{8T4_"H8?C%U0 本文主要介绍在Eclipse中使用的情况51Testing软件测试网 Z.UlzBQ#n_
FindBugs
Y,j q.q4|@0 是一个可以在Java程序中发现Bugs的程序。51Testing软件测试网_#Vz]({:?"i?
它是专门用来寻找处于“Bug Patterns”列表中的代码的。51Testing软件测试网/[7`6a{"S,z"w4po
Bug Patterns指很有可能是错误的代码的实例。51Testing软件测试网*x)O2ov%],m R
打开Bug DEtails视图51Testing软件测试网*do{5Qmco#K
Windows => Show View => OtHEr… => FIndBugs=>BugDEtails
ZuF)~mPa0
6B f0\'hNWwN0
在PackageExplorer或Navigator视图中,选中你的Java项目,右键,可以看到“FIndBugs”菜单项,子菜单项里有“FIndBugs”和“Clear Bug Markers”两项内容,如下图所示:
M.w&T6Oy M`pC051Testing软件测试网 m}-x1z.Ma
我们建立一个简单的测试文件TeST.java 内容如下:
6j,{]U^ pN)MH7o0 public claSS TeST private STring name; public STringgetName()return name; public void setName(STring name) this.name =name;51Testing软件测试网6T(bY4m9V%rA3e0@
我们点中“FInd Bugs”,运行时会出现如下进度框:
-{%LW!^6i1M)W0 运行结束后可以在ProbleMS中看到增加了如下的警告信息内容51Testing软件测试网J f{%c|
FindBugs
;Ka3Q&G-i!Z7H\T0 运行后的警告信息内容不仅在ProbleMS视图中显示,而且将标记在源代码标记框中,在源代码编辑器中我们可以看到警告标识,如下图:51Testing软件测试网@.NiE F
X&gC)X6J(`Ovq0
当光标指向你的警告信息的代码上面时,就会有相应的错误提示信息,与Eclipse本身的错误或警告信息提示类似。
+ysU(}%cl$c7h'H051Testing软件测试网 ]Fa^O^O ]^
选中ProbleMS视图里出现的相应问题,就会在代码编辑器里切换到相应的代码上去,方便根据相应的提示信息进行代码的修改。51Testing软件测试网!C9w;UN @fqX4uK
xd\c8i ]:Z8MERk0
在ProbleMS视图里,选中相应的问题条目,右键,在弹出的菜单中,可以看到“Show BugDEtails”,如下图所示:51Testing软件测试网1TFJwgM-r9Fp p E*z
51Testing软件测试网Z9eXlYf5J]r9k`
点中它,会切换到Bug DEtails视图上去,显示更加详细的提示信息。
l AVO&w7W"{w0
G#`zWvAY0 当然,在代码编辑窗口中,点击带有警告提示信息的图标时,也会自动切换到BudDEtails窗口去,查看详细的警告信息,如下图所示。51Testing软件测试网+p?'lM ^
51Testing软件测试网9dpv!Rf
根据这里详细的信息,你可以得到FIndBugs为什么会对你的代码报警告信息,及相应的处理办法,根据它的提示,你可以快速方便地进行代码修改。
IY1CqI0
vU!N^%z0
根据提示,我们将代码修改成如下,再运行就不会报有警告信息了。51Testing软件测试网vF!cC/M/?B
51Testing软件测试网Kw;zt7j1nE:HC:E
public claSS TeST private STring name; public STringgetName()STring temp = name; return temp; public voidsetName(STring name)STring temp = name; this.name = temp;51Testing软件测试网C'dB5g{?
配置51Testing软件测试网C(b'K)`j)`v6b
FindBugs51Testing软件测试网\ CeERK1aKiw
可以配置的信息包括如上图所示的四个选项的相关设置:51Testing软件测试网AC9}CN`gF0Q,p\
1. Run FIndBugs Automatically开关51Testing软件测试网(p&V'F,vR
当此项选中后,FIndBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FIndBugs就会运行,并将相应的信息显示出来。
u;MW Q5Km0 当此项没有选中,你只能每次在需要的时候自己去运行FIndBugs来检查你的代码。
IZ"Ki km X+]0 2. Minimum priority to report选择项51Testing软件测试网pCsc)b~
这个选择项是让你选择哪个级别的信息进行显示,有Low、Medium、High三个选择项可以选择,很类似于Log4J的级别设置啦。比如:
/o-\B]?[,J0 你选择了High选择项,那么只有是High级别的提示信息才会被显示。
bdJqzAA0 你选择了Medium选择项,那么只有是Medium和High级别的提示信息才会被显示。
.n!JB K!z0 你选择了Low选择项,那么所有级别的提示信息都会被显示。51Testing软件测试网Ng.^v/]_~J*[3P
3. Enable bug categories选择项
$Y{ lh9t0]0 在这里是一些显示Bug分类的选择:51Testing软件测试网FE0UP~JHA
Correctness51Testing软件测试网'^u#AJp&Xs"[:A
关于代码正确性相关方面的51Testing软件测试网,?7]%{&mZ)nkw
Performance
HF(xB-k$}V{0 关于代码性能相关方面的51Testing软件测试网dt0il'D4_ s)|HA
Internationalization
4V@%K/Xp4U%a0 关于代码国际化相关方面的
3Sb-t1K4C1Q/b0b,v0 Multithreaded correctness
c%iS+nif{B0 关于代码多线程正确性相关方面的
w6zcjo3p$KG0 ST51Testing软件测试网:C-@e Rv|1X
yle关于代码样式相关方面的
3W zF_Y(rS0 Malicious code vulnerability
]bBWx0 关于恶意破坏代码相关方面的
7f.jn e5e0 比如:如果你把STyle的检查框去掉不选择中它,那么与STyle分类相关的警告信息就不会显示了。其它的类似。
,\)fkL1TIB"}0 4. Select bug patterns to cHEck for选择项
:dj.^{Y D!\]{2c0 在这里你可以选择所要进行检查的相关的Bug Pattern条目
A hc.KL0 可以从Bug coDEs、DEtectorname、DEtectorDEtion中看到相应的是要检查哪些方面的内容,你可以根据需要选择或去掉相应的 检查条件。
.p*or L v4V3t!R(d0 三、详细说明
8S{tnG X`0 FindBugs51Testing软件测试网;u4YMf)t lw,qaL
是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。FIndBugs自带检测器,其中有60余种Badpractice,80余种CorRECtneSS,1种INTernationalization,12种MaliCIouscoDEvulnerability,27种MultithreaDEdCorRECtneSS,23种Performance,43种Dodgy。51Testing软件测试网^1PY)^;Q}.u
Bad practice
5M/Z.P%`j"n0 坏的实践51Testing软件测试网7c#Ei%@3sX_.ZU
一些不好的实践,下面列举几个:51Testing软件测试网u2Y/`,C$z,DsH)Ya.M
HE
R#^us'r5Z3Q0 :
w)O.V^7|k:W!UY0 类定义了equals(),却没有hashCoDE();或类定义了equals(),却使用51Testing软件测试网~ @3GDU0x!AQ$r]
t.hashCoDE();或类定义了hashCoDE(),却没有equals();或类定义了hashCoDE(),却使用t.equals();类继承了equals(),却使用t.hashCoDE()。
!{tp'D['N$g0 SQL51Testing软件测试网 G h8V1vX'~`
:
_D!v'k0|QV0 ST51Testing软件测试网I!O:B6Z%J Dj] G
atement 的execute方法调用了非常量的字符串;或PreparedSTatement是由一个非常量的字符串产生。
9pk1p)C$x'c f4d0l0 DE51Testing软件测试网9nw2p0p"X C
:51Testing软件测试网!A`-Tb|3oIQ+O!a
方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。
3tEh2DEI0 Correctness
(sR+^zw0 一般的正确性问题51Testing软件测试网 t9H[2_h O.G/jB}b"Q,I
可能导致错误的代码,下面列举几个:
Qpp;XS,tsA@0 NP
0L:zxQ$vX%P[K M0 :51Testing软件测试网#y:B9D'X%?(K9g!L
空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。51Testing软件测试网Lz%TZa8W;F&\s.R
Nm51Testing软件测试网4M0KD5f\-V%g(l } f
:51Testing软件测试网fg)A/UH yd$`2{
类定义了hashcoDE()方法,但实际上并未覆盖父类t的hashCoDE();类定义了toSTring()方法,但实际上并未覆盖父类t的toSTring();很明显的方法和构造器混淆;方法名容易混淆。51Testing软件测试网;{.ud/L9b'G&d `
SQL
0v;R:nWg[&]~I \#|0 :51Testing软件测试网#dn1K_/E
方法尝试访问一个Prepared STatement的0索引;方法尝试访问一个ResultSet的0索引。51Testing软件测试网D#@:x7T6\#pG
UwF51Testing软件测试网5? yn^.e0L$h
:51Testing软件测试网&lB0Vup5q&A]
所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。
Q&](d`9V;|#h0 Internationalization
VNm9RI]0 国际化
X2_$Nk/@ x*e&Qbh0 当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。
M1{(b3q&|TrWW0 Malicious code vulnerability
h1\:JD2rXB0 可能受到的恶意攻击51Testing软件测试网$O3_B5^-]
如果代码公开,可能受到恶意攻击的代码,下面列举几个:
QEf;t4amy0 FI
I%`-t"jN0 :
T y5|"Z~#Q9DZz)b |C4o0 一个类的FInalize()应该是protected,而不是public的。51Testing软件测试网(S}}z!blnTN
MS51Testing软件测试网)A^ kH wtCs
:
WW/^|(}d0 属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。51Testing软件测试网 pX9A$]ep$L4[
Multithreaded correctness
'e3^s0KX Dy0 多线程的正确性
"f.X8sFp:V4Z(I0 多线程编程时,可能导致错误的代码,下面列举几个:
QK#y-Oc(\)`ZZ;N0 ESync51Testing软件测试网?(D$^)X"\gh5h
:
GTi5E3Z!A0 空的同步块,很难被正确使用。51Testing软件测试网,I3Azy(B f2}
MWN
*U*i?LQ~;F0 :51Testing软件测试网.MI9K Id,J@&BE
错误使用Notify(),可能导致IllegalMonitorSTateException异常;或错误的51Testing软件测试网(N"R3{~]&~
使用wait()。51Testing软件测试网 zb5Tvd
No
!Q C(j#D^+C:HE1t2\0 :
3bGf%k%aPG0 使用Notify()而不是NotifyAll(),只是唤醒一个线程而不是所有等待的线程。51Testing软件测试网 J} j-i.LsY~
SC51Testing软件测试网)i$b&Tj\\
:
#[b-GV6v"iub0 构造器调用了Thread.STart(),当该类被继承可能会导致错误。51Testing软件测试网 Lq5h{,fDZ
Performance
7M5M~V^1_*I"s:k0 性能问题51Testing软件测试网zW\,j0} } T
可能导致性能不佳的代码,下面列举几个:51Testing软件测试网.~ Sd(yY{"~ a1F'O
DM
1?wu6Y'pN P0 :
NdT-D4rC0A|0~$G"X'V0 INT51Testing软件测试网eJu'o"u)d8kE
eger.toSTring(1)代替newINTeger(1).toSTring();方法调用了低效的float的构造器,应该用静态的valueOf方法。51Testing软件测试网%sy3P(Z ]}E&O#|)f
SIC
.wK;K5dt.kQvN]X0[0 :51Testing软件测试网)B0bsCf-nTN
如果一个内部类想在更广泛的地方被引用,它应该声明为STatic。
U9yf~uN0J0 SS51Testing软件测试网1u7J Do+fN
:51Testing软件测试网 RS~h'y
如果一个实例属性不被读取,考虑声明为STatic。
ZG&rO`g*u'g\:N0 UrF
8Zx0`V'A]0 :
,^:tK$`n0 如果一个属性从没有被read,考虑从类中去掉。
#g;S+Zd)k {U0 UuF51Testing软件测试网J+mC;P1YY A'w
:
2HF&w2G3vLp^CZ0 如果一个属性从没有被使用,考虑从类中去掉。
(l-o6}0oQfU j0 Dodgy51Testing软件测试网!n4vpQi7V`?9\
危险的51Testing软件测试网3I z ?V&Gz5Ww#H
具有潜在危险的代码,可能运行期产生错误,下面列举几个:51Testing软件测试网^#rMoa5i^\)s4N*n
CI
M6Y5\:r6J*PI"@0 :51Testing软件测试网5ZS0]hfL
类声明为FInal但声明了protected的属性。
/x{7Q8[9R n6G2~C0 DLS
L HZ[?6`(T0 :
1UuM oU2H]]0 对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。51Testing软件测试网c#C2d v*pT
ICAST51Testing软件测试网%Q;]fAt K p
:51Testing软件测试网(lk/?%c,Zj$XU
整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。
&v\{i7y&A |0 INT
6L-ag~;rN0 :
7I?:se {3xTD\0 没必要的整型数字比较,如X <= INTeger.MAX_VALUE。
)u%Yl&N6h4ys0 NP51Testing软件测试网6c+Qg6Y:[i?l5l+W:\1W
:
sBgy@0 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。51Testing软件测试网-Mc(s v.?z e K [
REC
51Testing软件测试网{] [ C~$~-}
是一个在java程序中查找bug的程序,它查找bug模式的实例,也就是可能出错的代码实例,注意FIndBugs是检查java字节码,也就是*.claSS文件。
Z)W1YG9@Or0 其实准确的说,它是寻找代码缺陷的,很多我们写的不好的地方,可以优化的地方,它都能检查出来。例如:未关闭的数据库连接,缺少必要的nullcHEck,多余的nullcHEck,多余的if后置条件,相同的条件分支,重复的代码块,错误的使用了"",建议使用STringBuffer代替字符串连加等等。而且我们还可以自己配置检查规则(做哪些检查,不做哪些检查),也可以自己来实现独有的校验规则(用户自定义特定的bug模式需要继承它的接口,编写自己的校验类,属于高级技巧)。
[*h"Gc)Qz|d0 一、安装方法
#I*K,Uqg,nu7S0m)\0 详情见:http://FIndBugs.cs.umd.edu/eclipse
$fCL/t%f\G je0G0 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.
\A s4x#qR x0 To inSTall tHE FIndBugs plugin:
9T*dA0@QK ?0 1. In Eclipse, click on HElp -> Software Update -> FIndandInSTall...51Testing软件测试网2?Y0KUsq_:nI
2. Choose tHE Search for new features to inSTall option, andclickNext.
"Bq;|6A4Qz]@0 3. Click New Remote Site.
;`,V)@+wA [&{0 4. Enter tHE following:
D3^'e~m0 * Name: FIndBugs update site
H{A}m8bU+v4B7q0 * URL: one of tHE following (Note: No FInal slash on tHE url)
3?e{`y,c2u}!w0 o http://FIndBugs.cs.umd.edu/eclipse for ofFICIal releases51Testing软件测试网!`gaz0nU$c m!e
o http://FIndBugs.cs.umd.edu/eclipse-candidate forcandidatereleases and ofFICIal releases51Testing软件测试网&Y.DI(P3S$SK
o http://FIndBugs.cs.umd.edu/eclipse-daily for allreleases,inculding DEvelopmental ones and click OK.
RE iR ]q!k ?,yP0 5. "FIndBugs update site" should appear unDEr Sites to incluDEinsearch.
0Kc8c&j_0a5w0 Click tHE cHEckbox next to it to select it, and click FInish.
Z8M*]AzO\P"c0 6. You should see FIndBugs Feature unDEr Select featurestoinSTall.
lk5]/\4\q1g2\0 (You may have to click on one or two triangles to make itvisiblein tHE tree.)51Testing软件测试网i)p?+`F-h
Select tHE cHEckbox next to it and click next.
"RNO3ls,]0 7. Select tHE I accept option to accept tHE license andclickNext.51Testing软件测试网2G yO%f\)~#j `}+?
8. Make sure tHE location is corRECt wHEre you"re inSTallingit.THE DEfault (your workspace) should be FIne. Click FInish.
*jdh8N.k-S1~0 9. THE plugin is Not digitally signed. Go aHEad and inSTallitanyway.51Testing软件测试网8@%@"hNz
二、使用方法
2O)d{8T4_"H8?C%U0 本文主要介绍在Eclipse中使用的情况51Testing软件测试网 Z.UlzBQ#n_
FindBugs
Y,j q.q4|@0 是一个可以在Java程序中发现Bugs的程序。51Testing软件测试网_#Vz]({:?"i?
它是专门用来寻找处于“Bug Patterns”列表中的代码的。51Testing软件测试网/[7`6a{"S,z"w4po
Bug Patterns指很有可能是错误的代码的实例。51Testing软件测试网*x)O2ov%],m R
打开Bug DEtails视图51Testing软件测试网*do{5Qmco#K
Windows => Show View => OtHEr… => FIndBugs=>BugDEtails
ZuF)~mPa0
6B f0\'hNWwN0
M.w&T6Oy M`pC051Testing软件测试网 m}-x1z.Ma
我们建立一个简单的测试文件TeST.java 内容如下:
6j,{]U^ pN)MH7o0 public claSS TeST private STring name; public STringgetName()return name; public void setName(STring name) this.name =name;51Testing软件测试网6T(bY4m9V%rA3e0@
我们点中“FInd Bugs”,运行时会出现如下进度框:
-{%LW!^6i1M)W0 运行结束后可以在ProbleMS中看到增加了如下的警告信息内容51Testing软件测试网J f{%c|
FindBugs
;Ka3Q&G-i!Z7H\T0 运行后的警告信息内容不仅在ProbleMS视图中显示,而且将标记在源代码标记框中,在源代码编辑器中我们可以看到警告标识,如下图:51Testing软件测试网@.NiE F
X&gC)X6J(`Ovq0
+ysU(}%cl$c7h'H051Testing软件测试网 ]Fa^O^O ]^
选中ProbleMS视图里出现的相应问题,就会在代码编辑器里切换到相应的代码上去,方便根据相应的提示信息进行代码的修改。51Testing软件测试网!C9w;UN @fqX4uK
xd\c8i ]:Z8MERk0
51Testing软件测试网Z9eXlYf5J]r9k`
l AVO&w7W"{w0
G#`zWvAY0 当然,在代码编辑窗口中,点击带有警告提示信息的图标时,也会自动切换到BudDEtails窗口去,查看详细的警告信息,如下图所示。51Testing软件测试网+p?'lM ^
51Testing软件测试网9dpv!Rf
IY1CqI0
vU!N^%z0
51Testing软件测试网Kw;zt7j1nE:HC:E
public claSS TeST private STring name; public STringgetName()STring temp = name; return temp; public voidsetName(STring name)STring temp = name; this.name = temp;51Testing软件测试网C'dB5g{?
配置51Testing软件测试网C(b'K)`j)`v6b
FindBugs51Testing软件测试网\ CeERK1aKiw
可以配置的信息包括如上图所示的四个选项的相关设置:51Testing软件测试网AC9}CN`gF0Q,p\
1. Run FIndBugs Automatically开关51Testing软件测试网(p&V'F,vR
当此项选中后,FIndBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FIndBugs就会运行,并将相应的信息显示出来。
u;MW Q5Km0 当此项没有选中,你只能每次在需要的时候自己去运行FIndBugs来检查你的代码。
IZ"Ki km X+]0 2. Minimum priority to report选择项51Testing软件测试网pCsc)b~
这个选择项是让你选择哪个级别的信息进行显示,有Low、Medium、High三个选择项可以选择,很类似于Log4J的级别设置啦。比如:
/o-\B]?[,J0 你选择了High选择项,那么只有是High级别的提示信息才会被显示。
bdJqzAA0 你选择了Medium选择项,那么只有是Medium和High级别的提示信息才会被显示。
.n!JB K!z0 你选择了Low选择项,那么所有级别的提示信息都会被显示。51Testing软件测试网Ng.^v/]_~J*[3P
3. Enable bug categories选择项
$Y{ lh9t0]0 在这里是一些显示Bug分类的选择:51Testing软件测试网FE0UP~JHA
Correctness51Testing软件测试网'^u#AJp&Xs"[:A
关于代码正确性相关方面的51Testing软件测试网,?7]%{&mZ)nkw
Performance
HF(xB-k$}V{0 关于代码性能相关方面的51Testing软件测试网dt0il'D4_ s)|HA
Internationalization
4V@%K/Xp4U%a0 关于代码国际化相关方面的
3Sb-t1K4C1Q/b0b,v0 Multithreaded correctness
c%iS+nif{B0 关于代码多线程正确性相关方面的
w6zcjo3p$KG0 ST51Testing软件测试网:C-@e Rv|1X
yle关于代码样式相关方面的
3W zF_Y(rS0 Malicious code vulnerability
]bBWx0 关于恶意破坏代码相关方面的
7f.jn e5e0 比如:如果你把STyle的检查框去掉不选择中它,那么与STyle分类相关的警告信息就不会显示了。其它的类似。
,\)fkL1TIB"}0 4. Select bug patterns to cHEck for选择项
:dj.^{Y D!\]{2c0 在这里你可以选择所要进行检查的相关的Bug Pattern条目
A hc.KL0 可以从Bug coDEs、DEtectorname、DEtectorDEtion中看到相应的是要检查哪些方面的内容,你可以根据需要选择或去掉相应的 检查条件。
.p*or L v4V3t!R(d0 三、详细说明
8S{tnG X`0 FindBugs51Testing软件测试网;u4YMf)t lw,qaL
是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。FIndBugs自带检测器,其中有60余种Badpractice,80余种CorRECtneSS,1种INTernationalization,12种MaliCIouscoDEvulnerability,27种MultithreaDEdCorRECtneSS,23种Performance,43种Dodgy。51Testing软件测试网^1PY)^;Q}.u
Bad practice
5M/Z.P%`j"n0 坏的实践51Testing软件测试网7c#Ei%@3sX_.ZU
一些不好的实践,下面列举几个:51Testing软件测试网u2Y/`,C$z,DsH)Ya.M
HE
R#^us'r5Z3Q0 :
w)O.V^7|k:W!UY0 类定义了equals(),却没有hashCoDE();或类定义了equals(),却使用51Testing软件测试网~ @3GDU0x!AQ$r]
t.hashCoDE();或类定义了hashCoDE(),却没有equals();或类定义了hashCoDE(),却使用t.equals();类继承了equals(),却使用t.hashCoDE()。
!{tp'D['N$g0 SQL51Testing软件测试网 G h8V1vX'~`
:
_D!v'k0|QV0 ST51Testing软件测试网I!O:B6Z%J Dj] G
atement 的execute方法调用了非常量的字符串;或PreparedSTatement是由一个非常量的字符串产生。
9pk1p)C$x'c f4d0l0 DE51Testing软件测试网9nw2p0p"X C
:51Testing软件测试网!A`-Tb|3oIQ+O!a
方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。
3tEh2DEI0 Correctness
(sR+^zw0 一般的正确性问题51Testing软件测试网 t9H[2_h O.G/jB}b"Q,I
可能导致错误的代码,下面列举几个:
Qpp;XS,tsA@0 NP
0L:zxQ$vX%P[K M0 :51Testing软件测试网#y:B9D'X%?(K9g!L
空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否null;null值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNull的null参数;方法的返回值声明为@NonNull实际是null。51Testing软件测试网Lz%TZa8W;F&\s.R
Nm51Testing软件测试网4M0KD5f\-V%g(l } f
:51Testing软件测试网fg)A/UH yd$`2{
类定义了hashcoDE()方法,但实际上并未覆盖父类t的hashCoDE();类定义了toSTring()方法,但实际上并未覆盖父类t的toSTring();很明显的方法和构造器混淆;方法名容易混淆。51Testing软件测试网;{.ud/L9b'G&d `
SQL
0v;R:nWg[&]~I \#|0 :51Testing软件测试网#dn1K_/E
方法尝试访问一个Prepared STatement的0索引;方法尝试访问一个ResultSet的0索引。51Testing软件测试网D#@:x7T6\#pG
UwF51Testing软件测试网5? yn^.e0L$h
:51Testing软件测试网&lB0Vup5q&A]
所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write。
Q&](d`9V;|#h0 Internationalization
VNm9RI]0 国际化
X2_$Nk/@ x*e&Qbh0 当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。
M1{(b3q&|TrWW0 Malicious code vulnerability
h1\:JD2rXB0 可能受到的恶意攻击51Testing软件测试网$O3_B5^-]
如果代码公开,可能受到恶意攻击的代码,下面列举几个:
QEf;t4amy0 FI
I%`-t"jN0 :
T y5|"Z~#Q9DZz)b |C4o0 一个类的FInalize()应该是protected,而不是public的。51Testing软件测试网(S}}z!blnTN
MS51Testing软件测试网)A^ kH wtCs
:
WW/^|(}d0 属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。51Testing软件测试网 pX9A$]ep$L4[
Multithreaded correctness
'e3^s0KX Dy0 多线程的正确性
"f.X8sFp:V4Z(I0 多线程编程时,可能导致错误的代码,下面列举几个:
QK#y-Oc(\)`ZZ;N0 ESync51Testing软件测试网?(D$^)X"\gh5h
:
GTi5E3Z!A0 空的同步块,很难被正确使用。51Testing软件测试网,I3Azy(B f2}
MWN
*U*i?LQ~;F0 :51Testing软件测试网.MI9K Id,J@&BE
错误使用Notify(),可能导致IllegalMonitorSTateException异常;或错误的51Testing软件测试网(N"R3{~]&~
使用wait()。51Testing软件测试网 zb5Tvd
No
!Q C(j#D^+C:HE1t2\0 :
3bGf%k%aPG0 使用Notify()而不是NotifyAll(),只是唤醒一个线程而不是所有等待的线程。51Testing软件测试网 J} j-i.LsY~
SC51Testing软件测试网)i$b&Tj\\
:
#[b-GV6v"iub0 构造器调用了Thread.STart(),当该类被继承可能会导致错误。51Testing软件测试网 Lq5h{,fDZ
Performance
7M5M~V^1_*I"s:k0 性能问题51Testing软件测试网zW\,j0} } T
可能导致性能不佳的代码,下面列举几个:51Testing软件测试网.~ Sd(yY{"~ a1F'O
DM
1?wu6Y'pN P0 :
NdT-D4rC0A|0~$G"X'V0 INT51Testing软件测试网eJu'o"u)d8kE
eger.toSTring(1)代替newINTeger(1).toSTring();方法调用了低效的float的构造器,应该用静态的valueOf方法。51Testing软件测试网%sy3P(Z ]}E&O#|)f
SIC
.wK;K5dt.kQvN]X0[0 :51Testing软件测试网)B0bsCf-nTN
如果一个内部类想在更广泛的地方被引用,它应该声明为STatic。
U9yf~uN0J0 SS51Testing软件测试网1u7J Do+fN
:51Testing软件测试网 RS~h'y
如果一个实例属性不被读取,考虑声明为STatic。
ZG&rO`g*u'g\:N0 UrF
8Zx0`V'A]0 :
,^:tK$`n0 如果一个属性从没有被read,考虑从类中去掉。
#g;S+Zd)k {U0 UuF51Testing软件测试网J+mC;P1YY A'w
:
2HF&w2G3vLp^CZ0 如果一个属性从没有被使用,考虑从类中去掉。
(l-o6}0oQfU j0 Dodgy51Testing软件测试网!n4vpQi7V`?9\
危险的51Testing软件测试网3I z ?V&Gz5Ww#H
具有潜在危险的代码,可能运行期产生错误,下面列举几个:51Testing软件测试网^#rMoa5i^\)s4N*n
CI
M6Y5\:r6J*PI"@0 :51Testing软件测试网5ZS0]hfL
类声明为FInal但声明了protected的属性。
/x{7Q8[9R n6G2~C0 DLS
L HZ[?6`(T0 :
1UuM oU2H]]0 对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。51Testing软件测试网c#C2d v*pT
ICAST51Testing软件测试网%Q;]fAt K p
:51Testing软件测试网(lk/?%c,Zj$XU
整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。
&v\{i7y&A |0 INT
6L-ag~;rN0 :
7I?:se {3xTD\0 没必要的整型数字比较,如X <= INTeger.MAX_VALUE。
)u%Yl&N6h4ys0 NP51Testing软件测试网6c+Qg6Y:[i?l5l+W:\1W
:
sBgy@0 对readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null。51Testing软件测试网-Mc(s v.?z e K [
REC