十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

[转]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#qRx0  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$cm!e
  o http://FIndBugs.cs.umd.edu/eclipse-candidate forcandidatereleases and ofFICIal releases51Testing软件测试网&Y.D I(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)O2o v%],m R
  打开Bug DEtails视图51Testing软件测试网*do{5Qmco#K
  Windows => Show View => OtHEr… => FIndBugs=>BugDEtails
ZuF)~mPa0
6Bf0\'hNWwN0
  在PackageExplorer或Navigator视图中,选中你的Java项目,右键,可以看到“FIndBugs”菜单项,子菜单项里有“FIndBugs”和“Clear Bug Markers”两项内容,如下图所示:
M.w&T6Oy M`pC051Testing软件测试网m}-x1z.M a
  我们建立一个简单的测试文件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(b Y4m9V%rA3e0@
  我们点中“FInd Bugs”,运行时会出现如下进度框:
-{%L W!^6i1M)W0  运行结束后可以在ProbleMS中看到增加了如下的警告信息内容51Testing软件测试网J f{%c|
  FindBugs
;Ka3Q&G-i!Z7H\T0  运行后的警告信息内容不仅在ProbleMS视图中显示,而且将标记在源代码标记框中,在源代码编辑器中我们可以看到警告标识,如下图:51Testing软件测试网@.NiE F

X&gC)X6J(`Ovq0
  当光标指向你的警告信息的代码上面时,就会有相应的错误提示信息,与Eclipse本身的错误或警告信息提示类似。
+ys U(}%cl$c7h'H051Testing软件测试网 ]Fa^O^O ]^
  选中ProbleMS视图里出现的相应问题,就会在代码编辑器里切换到相应的代码上去,方便根据相应的提示信息进行代码的修改。51Testing软件测试网!C9w;UN @f qX4u K

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为什么会对你的代码报警告信息,及相应的处理办法,根据它的提示,你可以快速方便地进行代码修改。
I Y1CqI0
vU!N^%z0
  根据提示,我们将代码修改成如下,再运行就不会报有警告信息了。51Testing软件测试网vF!cC/M/?B
51Testing软件测试网Kw;zt7j1nE:H C: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}C N`gF0Q,p\
  1. Run FIndBugs Automatically开关51Testing软件测试网(p&V'F,vR
  当此项选中后,FIndBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FIndBugs就会运行,并将相应的信息显示出来。
u;MW Q5Km0  当此项没有选中,你只能每次在需要的时候自己去运行FIndBugs来检查你的代码。
IZ"Kikm X+]0  2. Minimum priority to report选择项51Testing软件测试网pCsc)b~
  这个选择项是让你选择哪个级别的信息进行显示,有Low、Medium、High三个选择项可以选择,很类似于Log4J的级别设置啦。比如:
/o-\B]?[,J0  你选择了High选择项,那么只有是High级别的提示信息才会被显示。
bdJqz AA0  你选择了Medium选择项,那么只有是Medium和High级别的提示信息才会被显示。
.n!JBK!z0  你选择了Low选择项,那么所有级别的提示信息都会被显示。51Testing软件测试网Ng.^v/] _~J*[3P
  3. Enable bug categories选择项
$Y{ lh9t0]0  在这里是一些显示Bug分类的选择:51Testing软件测试网F E0U P~JHA
  Correctness51Testing软件测试网'^u#AJp&Xs"[:A
  关于代码正确性相关方面的51Testing软件测试网,?7]%{&m Z)nkw
  Performance
HF(xB-k$}V{0  关于代码性能相关方面的51Testing软件测试网dt0il'D4_ s)|HA
  Internationalization
4V@%K/Xp4U%a0  关于代码国际化相关方面的
3S b-t1K4C1Q/b0b,v0  Multithreaded correctness
c%iS+nif{B0  关于代码多线程正确性相关方面的
w6zcjo3p$KG0  ST51Testing软件测试网:C-@e Rv|1X
  yle关于代码样式相关方面的
3W zF_Y(rS0  Malicious code vulnerability
]b BWx0  关于恶意破坏代码相关方面的
7f.jne5e0  比如:如果你把STyle的检查框去掉不选择中它,那么与STyle分类相关的警告信息就不会显示了。其它的类似。
,\)fkL1TIB"}0  4. Select bug patterns to cHEck for选择项
:dj.^{Y D!\]{2c0  在这里你可以选择所要进行检查的相关的Bug Pattern条目
Ahc.KL0  可以从Bug coDEs、DEtectorname、DEtectorDEtion中看到相应的是要检查哪些方面的内容,你可以根据需要选择或去掉相应的 检查条件。
.p*or L v4V3t!R(d0  三、详细说明
8S{t nG X`0  FindBugs51Testing软件测试网;u4YMf)tlw,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;X S,tsA@0  NP
0L:zxQ$vX%P[KM0  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\:JD2rX B0  可能受到的恶意攻击51Testing软件测试网$O3_B5^-]
  如果代码公开,可能受到恶意攻击的代码,下面列举几个:
QEf;t4amy0  FI
I%`-t"jN0  
T y5|"Z~#Q9DZz)b |C4o0  一个类的FInalize()应该是protected,而不是public的。51Testing软件测试网(S}}z!bln TN
  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
  
G Ti5E3Z!A0  空的同步块,很难被正确使用。51Testing软件测试网,I3Azy(B f2}
  MWN
*U*i?LQ~;F0  51Testing软件测试网.MI9K Id,J@&BE
  错误使用Notify(),可能导致IllegalMonitorSTateException异常;或错误的51Testing软件测试网(N"R3{~]&~
  使用wait()。51Testing软件测试网 zb5Tv d
  No
!QC(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软件测试网)B0bs Cf-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
  
2H F&w2G3v Lp ^C Z0  如果一个属性从没有被使用,考虑从类中去掉。
(l-o6}0oQfU j0  Dodgy51Testing软件测试网!n4v pQi7V` ?9\
  危险的51Testing软件测试网3I z ?V&Gz5Ww#H
  具有潜在危险的代码,可能运行期产生错误,下面列举几个:51Testing软件测试网^#rMoa5i^\)s4N*n
  CI
M6Y5\:r6J*P I"@0  51Testing软件测试网5ZS0]hfL
  类声明为FInal但声明了protected的属性。
/x{7Q8[9R n6G2~C0  DLS
L HZ[?6`(T0  
1U uMoU2H]]0  对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。51Testing软件测试网c#C2d v*pT
  ICAST51Testing软件测试网%Q;]fAtK 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
h^2OEe#i)] g]0  
W7_#k f+]?8k Z8|0  直接捕获Exception,而实际上可能是RuntimeException。
0JA(?,e Y},J mt{0  ST
&osop$x'g0  
5oC;N@%r0  从实例方法里直接修改类变量,即STatic属性。
%x!D}nU!nP0  总结51Testing软件测试网,SNoW@g/N
  此插件的功能很不错,可以帮助我们提升Java代码的编写能力,写出更加安全可靠的代码。建议使用或加在Ant里进行持续构建。
-N*Q`$s]Mv*Q.P0  现在,你可以马上拿出你已经开发的一个项目,检查一下你的代码有没有问题了。51Testing软件测试网l#a1Ngx @}8R#z
  编辑推荐
r,_` o+g h?0  Ubuntu安装Eclipse-SDK-3.3小结
Q d i8wNG H@N0  Eclipse插件jINTo资源配置文件51Testing软件测试网?!eHCh5so
  Eclipse启动参数大全
nIC!s+l n+r4T%e:n0  深入浅出Eclipse RCP(1):HEllo RCP51Testing软件测试网/t7hbhS$E:O
  Eclipse自动补全增强

TAG: Eclipse插件 FindBugs

 

评分:0

我来说两句

Open Toolbar