From 1cc5e5ce9c8c1c14b3169923dbbeec292800c5ea Mon Sep 17 00:00:00 2001 From: Julian Dolby Date: Wed, 10 Apr 2013 21:09:10 -0400 Subject: [PATCH] fixes for bug with dead code and exception handlers --- .../java/loader/JavaSourceLoaderImpl.java | 17 +++---- .../translator/JavaCAst2IRTranslator.java | 4 +- .../js/test/TestSimpleCallGraphShape.java | 5 ++ .../ipa/callgraph/ArgumentSpecialization.java | 3 +- .../js/ipa/callgraph/JSCallGraphUtil.java | 4 +- .../wala/cast/js/loader/JavaScriptLoader.java | 7 +-- .../cast/js/translator/JSAstTranslator.java | 5 +- .../ibm/wala/cast/ir/ssa/AstIRFactory.java | 15 +++--- .../cast/ir/translator/AstTranslator.java | 48 ++++++++----------- .../com/ibm/wala/cast/loader/AstMethod.java | 10 ++-- 10 files changed, 66 insertions(+), 52 deletions(-) diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/loader/JavaSourceLoaderImpl.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/loader/JavaSourceLoaderImpl.java index d0b942bdc..9684f85fd 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/loader/JavaSourceLoaderImpl.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/loader/JavaSourceLoaderImpl.java @@ -49,6 +49,7 @@ import com.ibm.wala.cast.tree.CAstSourcePositionMap; import com.ibm.wala.cast.tree.CAstType; import com.ibm.wala.cast.tree.CAstType.Function; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.ClassLoaderImpl; import com.ibm.wala.classLoader.IClass; @@ -159,9 +160,9 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { } private void addMethod(CAstEntity methodEntity, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { declaredMethods.put(Util.methodEntityToSelector(methodEntity), new ConcreteJavaMethod(methodEntity, owner, cfg, symtab, - hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo)); + hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo)); } private void addMethod(CAstEntity methodEntity, IClass owner) { @@ -239,9 +240,9 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { private final TypeReference[] exceptionTypes; public JavaEntityMethod(CAstEntity methodEntity, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { super(owner, methodEntity.getQualifiers(), cfg, symtab, MethodReference.findOrCreate(owner.getReference(), Util - .methodEntityToSelector(methodEntity)), hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo, JavaSourceLoaderImpl.this.getAnnotations(methodEntity)); + .methodEntityToSelector(methodEntity)), hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo, JavaSourceLoaderImpl.this.getAnnotations(methodEntity)); this.parameterTypes = computeParameterTypes(methodEntity); this.exceptionTypes = computeExceptionTypes(methodEntity); } @@ -350,8 +351,8 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { */ public class ConcreteJavaMethod extends JavaEntityMethod { public ConcreteJavaMethod(CAstEntity methodEntity, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { - super(methodEntity, owner, cfg, symtab, hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo); + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + super(methodEntity, owner, cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo); } public IClassHierarchy getClassHierarchy() { @@ -478,8 +479,8 @@ public abstract class JavaSourceLoaderImpl extends ClassLoaderImpl { } public void defineFunction(CAstEntity n, IClass owner, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { - ((JavaClass) owner).addMethod(n, owner, cfg, symtab, hasCatchBlock, catchTypes, hasMonitorOp, lexicalInfo, debugInfo); + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + ((JavaClass) owner).addMethod(n, owner, cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo); } public void defineAbstractFunction(CAstEntity n, IClass owner) { diff --git a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaCAst2IRTranslator.java b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaCAst2IRTranslator.java index a2f721d29..64c38481a 100644 --- a/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaCAst2IRTranslator.java +++ b/com.ibm.wala.cast.java/src/com/ibm/wala/cast/java/translator/JavaCAst2IRTranslator.java @@ -15,6 +15,7 @@ package com.ibm.wala.cast.java.translator; import java.util.Collection; import java.util.Iterator; +import java.util.Map; import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl; @@ -30,6 +31,7 @@ import com.ibm.wala.cast.tree.CAstType; import com.ibm.wala.cast.tree.CAstType.Method; import com.ibm.wala.cast.tree.visit.CAstVisitor; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.ModuleEntry; @@ -229,7 +231,7 @@ public class JavaCAst2IRTranslator extends AstTranslator { } protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, - boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { // N.B.: base class may actually ask to create a synthetic type to wrap // code bodies, so we may see other things than TYPE_ENTITY here. diff --git a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java index 2addd63c7..11be6f5ce 100755 --- a/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java +++ b/com.ibm.wala.cast.js.test/harness-src/com/ibm/wala/cast/js/test/TestSimpleCallGraphShape.java @@ -643,6 +643,11 @@ public abstract class TestSimpleCallGraphShape extends TestJSCallGraphShape { verifyGraphAssertions(CG, assertionsForDeadCode); } + @Test + public void testDeadCatch() throws IllegalArgumentException, IOException, CancelException, WalaException { + JSCallGraphBuilderUtil.makeScriptCG("tests", "dead_catch.js"); + } + @Test(expected = CallGraphBuilderCancelException.class) public void testManyStrings() throws IllegalArgumentException, IOException, CancelException, WalaException { SSAPropagationCallGraphBuilder B = JSCallGraphBuilderUtil.makeScriptCGBuilder("tests", "many-strings.js"); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java index ec6934dc6..d9b1e25e2 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/ArgumentSpecialization.java @@ -21,6 +21,7 @@ import com.ibm.wala.cast.util.CAstPattern; import com.ibm.wala.cast.util.CAstPattern.Segments; import com.ibm.wala.cfg.AbstractCFG; import com.ibm.wala.cfg.ControlFlowGraph; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.callgraph.AnalysisCache; @@ -291,7 +292,7 @@ public class ArgumentSpecialization { @Override protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, - boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, DebuggingInformation debugInfo) { if (N == codeBodyEntity) { specializedCode = myloader.makeCodeBodyCode(cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, LI, debugInfo, method.getDeclaringClass()); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java index a7ae2ebfe..c998c5398 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/ipa/callgraph/JSCallGraphUtil.java @@ -16,6 +16,7 @@ import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.Map; import java.util.Set; import com.ibm.wala.cast.ipa.callgraph.StandardFunctionTargetSelector; @@ -36,6 +37,7 @@ import com.ibm.wala.cast.tree.visit.CAstVisitor; import com.ibm.wala.cast.types.AstMethodReference; import com.ibm.wala.cast.util.CAstPrinter; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.ClassLoaderFactory; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.SourceURLModule; @@ -163,7 +165,7 @@ public class JSCallGraphUtil extends com.ibm.wala.cast.ipa.callgraph.CAstCallGra JSAstTranslator toIR = new JSAstTranslator(cl) { @Override protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, - boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, DebuggingInformation debugInfo) { String fnName = "L" + composeEntityName(definingContext, N); names.add(fnName); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java index 24ef0c3ed..76e1760f4 100755 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/loader/JavaScriptLoader.java @@ -63,6 +63,7 @@ import com.ibm.wala.cast.tree.CAstSourcePositionMap; import com.ibm.wala.cast.tree.rewrite.CAstRewriterFactory; import com.ibm.wala.cast.types.AstMethodReference; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IClassLoader; @@ -705,7 +706,7 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { private CAstEntity entity; JavaScriptMethodObject(IClass cls, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { super(cls, functionQualifiers, cfg, symtab, AstMethodReference.fnReference(cls.getReference()), hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo, null); @@ -808,14 +809,14 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader { } public IMethod defineCodeBodyCode(String clsName, AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo) { JavaScriptCodeBody C = (JavaScriptCodeBody) lookupClass(clsName, cha); assert C != null : clsName; return C.setCodeBody(makeCodeBodyCode(cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo, C)); } public JavaScriptMethodObject makeCodeBodyCode(AbstractCFG cfg, SymbolTable symtab, boolean hasCatchBlock, - TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo, + Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo, IClass C) { return new JavaScriptMethodObject(C, cfg, symtab, hasCatchBlock, caughtTypes, hasMonitorOp, lexicalInfo, debugInfo); diff --git a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSAstTranslator.java b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSAstTranslator.java index df6402b9d..6b3465599 100644 --- a/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSAstTranslator.java +++ b/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/translator/JSAstTranslator.java @@ -10,6 +10,8 @@ *****************************************************************************/ package com.ibm.wala.cast.js.translator; +import java.util.Map; + import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.js.loader.JSCallSiteReference; import com.ibm.wala.cast.js.loader.JavaScriptLoader; @@ -26,6 +28,7 @@ import com.ibm.wala.cast.tree.impl.CAstSymbolImpl; import com.ibm.wala.cast.tree.visit.CAstVisitor; import com.ibm.wala.cast.types.AstMethodReference; import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.ssa.SymbolTable; import com.ibm.wala.types.FieldReference; @@ -135,7 +138,7 @@ public class JSAstTranslator extends AstTranslator { } protected void defineFunction(CAstEntity N, WalkContext definingContext, AbstractCFG cfg, SymbolTable symtab, - boolean hasCatchBlock, TypeReference[][] caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation LI, DebuggingInformation debugInfo) { if (DEBUG) System.err.println(("\n\nAdding code for " + N)); diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java index 937275478..852c6d675 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/ssa/AstIRFactory.java @@ -10,11 +10,14 @@ *****************************************************************************/ package com.ibm.wala.cast.ir.ssa; +import java.util.Map; + import com.ibm.wala.cast.loader.AstMethod; import com.ibm.wala.cast.loader.AstMethod.LexicalInformation; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.cfg.AbstractCFG; import com.ibm.wala.cfg.ControlFlowGraph; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ssa.DefaultIRFactory; @@ -82,12 +85,12 @@ public class AstIRFactory implements IRFactory { } } - private void setupCatchTypes(SSACFG cfg, TypeReference[][] catchTypes) { - for (int i = 0; i < catchTypes.length; i++) { - if (catchTypes[i] != null) { - ExceptionHandlerBasicBlock bb = (ExceptionHandlerBasicBlock) cfg.getNode(i); - for (int j = 0; j < catchTypes[i].length; j++) { - bb.addCaughtExceptionType(catchTypes[i][j]); + private void setupCatchTypes(SSACFG cfg, Map map) { + for(Map.Entry e : map.entrySet()) { + if (e.getKey().getNumber() != -1) { + ExceptionHandlerBasicBlock bb = (ExceptionHandlerBasicBlock) cfg.getNode(e.getKey().getNumber()); + for (int j = 0; j < e.getValue().length; j++) { + bb.addCaughtExceptionType(e.getValue()[j]); } } } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java index 5f470b4d2..e2b6de222 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/ir/translator/AstTranslator.java @@ -150,7 +150,7 @@ public abstract class AstTranslator extends CAstVisitor catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo); /** @@ -826,7 +826,7 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes(); void addEntityName(CAstEntity e, String name); @@ -2185,15 +2185,15 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes() { return parent.getCatchTypes(); } @@ -2286,7 +2286,7 @@ public abstract class AstTranslator extends CAstVisitor catchTypes = HashMapFactory.make(); Set, Integer>> exposedReads; Set, Integer>> exposedWrites; @@ -2362,20 +2362,14 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes() { return catchTypes; } @@ -3034,7 +3028,7 @@ public abstract class AstTranslator extends CAstVisitor catchTypes = functionContext.getCatchTypes(); AstCFG cfg = new AstCFG(n, functionContext.cfg(), symtab); Position[] line = functionContext.cfg().getLinePositionMap(); boolean katch = functionContext.cfg().hasCatchBlock(); @@ -4261,13 +4255,13 @@ public abstract class AstTranslator extends CAstVisitor getCatchTypes() { return null; } diff --git a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java index 125b6562f..3745a4190 100644 --- a/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java +++ b/com.ibm.wala.cast/source/java/com/ibm/wala/cast/loader/AstMethod.java @@ -11,6 +11,7 @@ package com.ibm.wala.cast.loader; import java.util.Collection; +import java.util.Map; import com.ibm.wala.cast.ir.translator.AstTranslator; import com.ibm.wala.cast.ir.translator.AstTranslator.AstLexicalInformation; @@ -19,6 +20,7 @@ import com.ibm.wala.cast.tree.CAstQualifier; import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position; import com.ibm.wala.cfg.AbstractCFG; import com.ibm.wala.cfg.ControlFlowGraph; +import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.ssa.SymbolTable; @@ -111,20 +113,20 @@ public abstract class AstMethod implements IMethod { private final MethodReference ref; private final boolean hasCatchBlock; private final boolean hasMonitorOp; - private final TypeReference[][] catchTypes; + private final Map catchTypes; private final AstLexicalInformation lexicalInfo; private final DebuggingInformation debugInfo; private final Collection annotations; protected AstMethod(IClass cls, Collection qualifiers, AbstractCFG cfg, SymbolTable symtab, MethodReference ref, - boolean hasCatchBlock, TypeReference[][] catchTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, + boolean hasCatchBlock, Map caughtTypes, boolean hasMonitorOp, AstLexicalInformation lexicalInfo, DebuggingInformation debugInfo, Collection annotations) { this.cls = cls; this.cfg = cfg; this.ref = ref; this.symtab = symtab; this.qualifiers = qualifiers; - this.catchTypes = catchTypes; + this.catchTypes = caughtTypes; this.hasCatchBlock = hasCatchBlock; this.hasMonitorOp = hasMonitorOp; this.lexicalInfo = lexicalInfo; @@ -161,7 +163,7 @@ public abstract class AstMethod implements IMethod { return symtab; } - public TypeReference[][] catchTypes() { + public Map catchTypes() { return catchTypes; }