Update of /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2813/src/com/mebigfatguy/fbcontrib/detect
Modified Files:
OrphanedDOMNode.java
Log Message:
if a dom node is passed as a parameter to any method, then we can't rule out that it is indeed attached to some document, or other dom container (ie: NodeSet)
Index: OrphanedDOMNode.java
===================================================================
RCS file: /cvsroot/fb-contrib/fb-contrib/src/com/mebigfatguy/fbcontrib/detect/OrphanedDOMNode.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- OrphanedDOMNode.java 23 Dec 2005 05:23:27 -0000 1.1
+++ OrphanedDOMNode.java 24 Dec 2005 02:26:53 -0000 1.2
@@ -24,6 +24,7 @@
import java.util.Set;
import org.apache.bcel.classfile.Code;
+import org.apache.bcel.generic.Type;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
@@ -34,7 +35,6 @@
public class OrphanedDOMNode extends BytecodeScanningDetector implements StatelessDetector
{
private static final Set<String> domCreationMethods = new HashSet<String>();
- private static final Set<String> domAppendMethods = new HashSet<String>();
static {
domCreationMethods.add("createAttribute:(Ljava/lang/String;)Lorg/w3c/dom/Attr;");
domCreationMethods.add("createAttributeNS:(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Attr;");
@@ -44,10 +44,6 @@
domCreationMethods.add("createElementNS:(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Element;");
domCreationMethods.add("createProcessingInstruction:(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/ProcessingInstruction;");
domCreationMethods.add("createTextNode:(Ljava/lang/String;)Lorg/w3c/dom/Text;");
-
- domAppendMethods.add("appendChild:(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;");
- domAppendMethods.add("setAttributeNode:(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;");
- domAppendMethods.add("setAttributeNodeNS:(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;");
}
private BugReporter bugReporter;
@@ -126,16 +122,6 @@
itemPC = new Integer(getPC());
}
}
- if (!sawCreate) {
- if (domAppendMethods.contains(methodInfo)) {
- if (stack.getStackDepth() > 0) {
- OpcodeStack.Item itm = stack.getStackItem(0);
- int reg = itm.getRegisterNumber();
- nodeCreations.remove(itm);
- nodeStores.remove(reg);
- }
- }
- }
} else if ((seen == ASTORE) || ((seen >= ASTORE_0) && seen <= ASTORE_3)) {
Integer pc = findDOMNodeCreationPoint(0);
int reg;
@@ -167,6 +153,27 @@
nodeStores.remove(new Integer(reg));
}
}
+
+ if (!sawCreate) {
+ if ((seen == INVOKEINTERFACE)
+ || (seen == INVOKEVIRTUAL)
+ || (seen == INVOKESTATIC)
+ || (seen == INVOKESPECIAL)) {
+ String methodSig = getSigConstantOperand();
+ int argCount = Type.getArgumentTypes(methodSig).length;
+ if (stack.getStackDepth() >= argCount) {
+ for (int a = 0; a < argCount; a++) {
+ OpcodeStack.Item itm = stack.getStackItem(a);
+ if (nodeCreations.containsKey(itm)) {
+ int reg = itm.getRegisterNumber();
+ nodeCreations.remove(itm);
+ nodeStores.remove(reg);
+ }
+ }
+ }
+ }
+
+ }
} finally {
stack.sawOpcode(this, seen);
if (sawCreate) {
|