[Fb-contrib-commit] fb-contrib/src/com/mebigfatguy/fbcontrib/detect OrphanedDOMNode.java,1.1,1.2
Brought to you by:
dbrosius
|
From: Dave B. <dbr...@us...> - 2005-12-24 02:27:02
|
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) { |