发布网友 发布时间: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 不注重样式或者格式