KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > edu > umd > cs > findbugs > detect > FindRunInvocations


1 /*
2  * FindBugs - Find bugs in Java programs
3  * Copyright (C) 2003-2005 University of Maryland
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  */

19
20 package edu.umd.cs.findbugs.detect;
21
22
23 import edu.umd.cs.findbugs.*;
24 import edu.umd.cs.findbugs.ba.Hierarchy;
25 import org.apache.bcel.classfile.Code;
26
27 public class FindRunInvocations extends BytecodeScanningDetector implements StatelessDetector {
28
29     private BugReporter bugReporter;
30     private boolean alreadySawStart;
31
32     public FindRunInvocations(BugReporter bugReporter) {
33         this.bugReporter = bugReporter;
34     }
35
36
37     private boolean isThread(String JavaDoc clazz) {
38         try {
39             return Hierarchy.isSubtype(clazz, "java.lang.Thread");
40         } catch (ClassNotFoundException JavaDoc e) {
41             bugReporter.reportMissingClass(e);
42             return false;
43         }
44     }
45
46     @Override JavaDoc
47          public void visit(Code obj) {
48         alreadySawStart = false;
49         super.visit(obj);
50     }
51
52     @Override JavaDoc
53          public void sawOpcode(int seen) {
54         if (alreadySawStart) return;
55         if ((seen == INVOKEVIRTUAL || seen == INVOKEINTERFACE)
56                 && getSigConstantOperand().equals("()V")
57                 && isThread(getDottedClassConstantOperand())
58         ) {
59             if (getNameConstantOperand().equals("start"))
60                 alreadySawStart = true;
61             else if (getNameConstantOperand().equals("run"))
62                 bugReporter
63                         .reportBug(new BugInstance(this, "RU_INVOKE_RUN", NORMAL_PRIORITY)
64                         .addClassAndMethod(this)
65                         .addSourceLine(this));
66         }
67     }
68 }
69
Popular Tags