问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何应用FindBugs工具静态分析和检查代码中

发布网友 发布时间:2022-04-07 19:08

我来回答

2个回答

懂视网 时间:2022-04-07 23:29

FieldDescriptor getFieldDescriptor() public MethodDescriptor getMethodDescriptor() public ClassDescriptor getClassDescriptor() public @SlashedClassName String getClassName() public void visitAfter(Code obj) public void visitAfter(JavaClass obj)

 

来个例子
public class DemoPlugin extends PreorderDetector {
 private BugReporter bugReporter;
 
 public DemoPlugin(BugReporter reporter){
 bugReporter = reporter;
 }

 public boolean hasHashcode;
 public boolean hasEqual;
 public MethodAnnotation equals;
 
 @Override
 public void visit(JavaClass obj){
 System.out.println("visit class!!!!!!!!!" + obj.getClassName());
 hasHashcode = false;
 hasEqual = false;
 equals = null;
 }
 
 @Override
 public void visit(Method me){
 if(!me.isPublic())
  return;
 if("equals".equals(me.getName()) && "(Ljava/lang/Object;)Z".equals(me.getSignature())){
  hasEqual = true;
  System.out.println("find equals() method");
  equals = MethodAnnotation.fromVisitedMethod(this);
 }
 
 if("hashCode".equals(me.getName()) && "()I".equals(me.getSignature())){
  hasHashcode = true;
  System.out.println("find hashCode() method");
 }
 
 if("hashcode".equals(me.getName()) && "()I".equals(me.getSignature())){
  bugReporter.reportBug(new BugInstance(this, "HASHCODE WRONG SPELL", NORMAL_PRIORITY).
   addClass(getDottedClassName()).addMethod(MethodAnnotation.fromVisitedMethod(this)));
 }
 }
 
 @Override
 public void visitAfter(JavaClass obj){
 if(hasEqual && !hasHashcode){
  BugInstance instance = new BugInstance(this, "EQUALS WITHOUT HASHCODE", NORMAL_PRIORITY).
   addClass(getDottedClassName()).addMethod(equals);
  bugReporter.reportBug(instance);
 }
 }
}

这里我们继承了PreorderDetector,而PreorderDetector继承了PreorderVisitor,是因为BugInstance需要使用Detector进行实例,而PreorderDetector实现了Detector接口。

上面方法我们使用了上个变量hasHashcode,hasEquals和equals,前两个变量用来保存当前访问的类是否存在hashCode和equals方法,第三个变量存放的是方法注释(要在报告bug中,这里先不管)。

上述三个变量每次都在visit(JavaClass obj)方法中进行状态重置,这样才能对所有的类都进行检测。visit(Method me)方法中用来判断是否是equals、hashCode、hashcode方法,并修改相应的状态。如果是hashcode方法,则直接将该bug报告。

visitAfter(JavaClass obj)方法执行时,已经对当前类检测完毕,这样可以判断是否出现equals方法,而没有出现hashCode方法的情况。

将fandbugs.xml和massage.xml加到项目中打包,便能对我们定义的模式进行检测。

以上仅是一个自定义在类、方法、字段层面上的检测器的一般步骤,例子仅是为了说明过程,只要我们熟悉我们想要检测的模式,就能通过上述方法实现。

FindBugs检测器实现(2)

标签:

热心网友 时间:2022-04-07 20:37

区别是: findbug与pclint都是针对软件漏洞进行代码检测的工具软件。findbug针对的是Java代码,pclint针对的是C代码或者C++。 Findbugs是一款Java静态代码分析工具,与其他静态分析工具(如Checkstyle和PMD)不同,Findbugs 不注重样式或者格式
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 PhotoShop2021 3D功能不能正常使用? 貔貅怎样自己开光?自己给貔貅开光的正宗方法? 药师佛八大化身是怎样的?分别有什么功效? 供奉药师佛有哪些好处 药师佛是佛吗? 王者荣耀qq转移到微信 药师佛适合什么人佩戴 药师佛吊坠开光上面有朱砂印吗 药师佛的功效真的很猛吗 药师佛佛牌有什么效果? 拜药师佛的作用? 药师佛的作用是什么? 药师佛最大的功效是什么? 佩戴药师佛对哪方面有好处? 药师佛佛牌有什么功效? 佩戴药师佛的好处 药师佛有什么功效和寓意? 西门子冰箱,机器门上面有就一个小的显示屏,不知道怎么调节 西门子冰箱液屏数据显示一半怎么解决? 世界上有多少个湿地公园散步? 你若早生三千年,吕布何须戏貂蝉,这句话是什么意思? 不仅有四大美人还有十大美人,她们都是哪些朝代的? 历史上面后来貂禅的命运如何??还有西施来?? 关羽是不是与貂蝉有一腿啊,张飞是不是和孙尚香有一腿啊 古代的四大美人,西施、貂蝉、王昭君、杨贵妃分别是哪个朝代的? 请问貂禅是什么时代的人物?她是不是一个很美的女人? 貂蝉是三国里的什么人物 古代西施、貂蝉、王昭君、杨玉环 四大美女都怎么死的。我只知道貂蝉是被关羽干掉。还有怎么死的就不知道了 貂蝉其实并不存在,那么吕布为什么非要杀死董卓呢? 三国正史上真的有貂蝉这个人吗 历史上,吕布为何要背叛董卓?因为貂蝉吗? 中国历史上能称得上红颜祸水的女人都有谁? 湖南农村信用社可以贷款吗 想在农村信用社贷款,能吗?个人没有结婚,可以贷款吗? 国内空调生产厂商有哪些? 农村信用社可以借钱吗 湖南农村信用社小额贷款 康佳kld-1920液晶电视白板怎么修 夜晶电视白板怎么修? 液晶电视机有白板功能吗?