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

[转]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.O X"@Da2c
  2. Choose tHE Search for new features to inSTall option, andclickNext.51Testing软件测试网K[jx pS Sv
  3. Click New Remote Site.
hxm sy1y,~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软件测试网qt e`X@ h
  o http://FIndBugs.cs.umd.edu/eclipse-candidate forcandidatereleases and ofFICIal releases51Testing软件测试网*]!N N+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软件测试网@!Cb e?\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,j s+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软件测试网%};FF x*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-O N)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;hE E
  在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-gD

-~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软件测试网nC#Y]"j
  1. Run FIndBugs Automatically开关
uZ6yb2p0  当此项选中后,FIndBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FIndBugs就会运行,并将相应的信息显示出来。51Testing软件测试网8B c e.` Y tC?
  当此项没有选中,你只能每次在需要的时候自己去运行FIndBugs来检查你的代码。
t x*^T-Fv9n P!](b0  2. Minimum priority to report选择项51Testing软件测试网4E7mz~#bF,z p
  这个选择项是让你选择哪个级别的信息进行显示,有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软件测试网A J!c&Gj.tn
  关于代码多线程正确性相关方面的51Testing软件测试网;C1qX:sDP2K$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-O R*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#A Q 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;xf0  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 `'S r0  一般的正确性问题
_;AMqK3`0  可能导致错误的代码,下面列举几个:51Testing软件测试网$H I-c I DT)U
  NP
&w;[3L1?0T0  51Testing软件测试网.t&Imh2D&Pe NU 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。
+eup k%BA h3WKd0  Internationalization
@8Po}!H4k+}"J7V\f0  国际化51Testing软件测试网+|;K P+V3_(}
  当对字符串使用upper或lowercase方法,如果是国际的字符串,可能会不恰当的转换。51Testing软件测试网9XKjJ4f:k2z
  Malicious code vulnerability51Testing软件测试网 O2I cys
  可能受到的恶意攻击
U g+d@u{3Mn~$K0  如果代码公开,可能受到恶意攻击的代码,下面列举几个:
:U4|:{UH Yjtc0  FI51Testing软件测试网4|rL}4n4[
  51Testing软件测试网+A$t`5?ZF;@Y3q!s ^
  一个类的FInalize()应该是protected,而不是public的。
"B9fpxI {(iL+Cd9RN+@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软件测试网9Ig T5pu A[a#C
  ESync
L _2@4O$rJ,b0  51Testing软件测试网.X B&YQ*s$jD
  空的同步块,很难被正确使用。
6i s p%Q9C0  MWN51Testing软件测试网R%Asz-{[/P}
  51Testing软件测试网,Mlv0q-C"T Y"b8J@]a
  错误使用Notify(),可能导致IllegalMonitorSTateException异常;或错误的51Testing软件测试网-e'Jm9Pu1v$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 f7M k
  可能导致性能不佳的代码,下面列举几个:
_-I-H `L2O8zT9N3U0  DM51Testing软件测试网F I @*G vS/[0?5~.?
  
!a@6}!U YX$}0  INT51Testing软件测试网&f:^ e3LPf
  eger.toSTring(1)代替newINTeger(1).toSTring();方法调用了低效的float的构造器,应该用静态的valueOf方法。
\c"VV G)\)}%[Zc0  SIC51Testing软件测试网-aI)e aY N'm)Du
  
m-jx9EZyPdtu0  如果一个内部类想在更广泛的地方被引用,它应该声明为STatic。
Na5p6MZyu h9p0  SS51Testing软件测试网~oU$VIb,e/}so
  
D gA-S&oR0  如果一个实例属性不被读取,考虑声明为STatic。
J7K)[6OH!e;}0  UrF51Testing软件测试网#]#?:z3? r-f7E
  
9a_&A ~RlkR0  如果一个属性从没有被read,考虑从类中去掉。51Testing软件测试网;z s Lv&G4a
  UuF51Testing软件测试网zd"n6Y;y\!i*w~ pj5U
  51Testing软件测试网l"Q f,y6cfC-WXf
  如果一个属性从没有被使用,考虑从类中去掉。51Testing软件测试网:{_B"@3g[S`n
  Dodgy51Testing软件测试网e0Hkn mp
  危险的
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软件测试网Q Z 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%Uv0v&T1~
  
5@C T3}2E-ee0  从实例方法里直接修改类变量,即STatic属性。51Testing软件测试网 i"xX2cx#eD$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#I Y3fFU0  Eclipse插件jINTo资源配置文件51Testing软件测试网)w{ E9fLN
  Eclipse启动参数大全
sR8] clB4hl:c$L[0  深入浅出Eclipse RCP(1):HEllo RCP
X2D.GH0l.wD0  Eclipse自动补全增强

TAG: Eclipse插件 FindBugs

 

评分:0

我来说两句

Open Toolbar