make slicer handle multiple languages, using the Language to build mod and ref visitors

This commit is contained in:
Julian Dolby 2018-06-01 13:56:08 -04:00
parent 196f7cb153
commit d1840f0531
5 changed files with 72 additions and 11 deletions

View File

@ -31,9 +31,9 @@ import com.ibm.wala.ipa.modref.ExtendedHeapModel;
public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> { public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
protected static class JavaScriptRefVisitor<T extends InstanceKey> extends AstRefVisitor<T> implements JSInstructionVisitor { public static class JavaScriptRefVisitor<T extends InstanceKey> extends AstRefVisitor<T> implements JSInstructionVisitor {
protected JavaScriptRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h) { public JavaScriptRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h) {
super(n, result, pa, (AstHeapModel)h); super(n, result, pa, (AstHeapModel)h);
} }
@ -80,9 +80,9 @@ public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
return new JavaScriptRefVisitor<>(n, result, pa, h); return new JavaScriptRefVisitor<>(n, result, pa, h);
} }
protected static class JavaScriptModVisitor<T extends InstanceKey> extends AstModVisitor<T> implements JSInstructionVisitor { public static class JavaScriptModVisitor<T extends InstanceKey> extends AstModVisitor<T> implements JSInstructionVisitor {
protected JavaScriptModVisitor(CGNode n, Collection<PointerKey> result, ExtendedHeapModel h, PointerAnalysis<T> pa) { public JavaScriptModVisitor(CGNode n, Collection<PointerKey> result, ExtendedHeapModel h, PointerAnalysis<T> pa) {
super(n, result, (AstHeapModel)h, pa); super(n, result, (AstHeapModel)h, pa);
} }

View File

@ -36,6 +36,8 @@ import com.ibm.wala.cast.ir.translator.TranslatorToCAst;
import com.ibm.wala.cast.ir.translator.TranslatorToIR; import com.ibm.wala.cast.ir.translator.TranslatorToIR;
import com.ibm.wala.cast.js.analysis.typeInference.JSPrimitiveType; import com.ibm.wala.cast.js.analysis.typeInference.JSPrimitiveType;
import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraph.JSFakeRoot; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraph.JSFakeRoot;
import com.ibm.wala.cast.js.ipa.modref.JavaScriptModRef;
import com.ibm.wala.cast.js.ipa.modref.JavaScriptModRef.JavaScriptRefVisitor;
import com.ibm.wala.cast.js.ssa.JSInstructionFactory; import com.ibm.wala.cast.js.ssa.JSInstructionFactory;
import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference; import com.ibm.wala.cast.js.ssa.JavaScriptCheckReference;
import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf; import com.ibm.wala.cast.js.ssa.JavaScriptInstanceOf;
@ -67,9 +69,16 @@ import com.ibm.wala.classLoader.LanguageImpl;
import com.ibm.wala.classLoader.ModuleEntry; import com.ibm.wala.classLoader.ModuleEntry;
import com.ibm.wala.classLoader.NewSiteReference; import com.ibm.wala.classLoader.NewSiteReference;
import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.IAnalysisCacheView; import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod; import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
import com.ibm.wala.ipa.modref.ModRef.ModVisitor;
import com.ibm.wala.ipa.modref.ModRef.RefVisitor;
import com.ibm.wala.shrikeBT.IBinaryOpInstruction.IOperator; import com.ibm.wala.shrikeBT.IBinaryOpInstruction.IOperator;
import com.ibm.wala.shrikeBT.IComparisonInstruction.Operator; import com.ibm.wala.shrikeBT.IComparisonInstruction.Operator;
import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod; import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod;
@ -669,6 +678,18 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader {
return new JSFakeRoot(cha, options, cache); return new JSFakeRoot(cha, options, cache);
} }
@Override
public <T extends InstanceKey> RefVisitor<T, ? extends ExtendedHeapModel> makeRefVisitor(CGNode n,
Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h) {
return new JavaScriptRefVisitor<>(n, result, pa, h);
}
@Override
public <T extends InstanceKey> ModVisitor<T, ? extends ExtendedHeapModel> makeModVisitor(CGNode n, Collection<PointerKey> result,
PointerAnalysis<T> pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) {
return new JavaScriptModRef.JavaScriptModVisitor<>(n, result, h, pa);
}
}; };
private final JavaScriptTranslatorFactory translatorFactory; private final JavaScriptTranslatorFactory translatorFactory;

View File

@ -21,11 +21,18 @@ import java.util.Collections;
import com.ibm.wala.analysis.typeInference.JavaPrimitiveType; import com.ibm.wala.analysis.typeInference.JavaPrimitiveType;
import com.ibm.wala.analysis.typeInference.PrimitiveType; import com.ibm.wala.analysis.typeInference.PrimitiveType;
import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.IAnalysisCacheView; import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod; import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod;
import com.ibm.wala.ipa.callgraph.impl.FakeRootClass; import com.ibm.wala.ipa.callgraph.impl.FakeRootClass;
import com.ibm.wala.ipa.callgraph.impl.FakeRootMethod; import com.ibm.wala.ipa.callgraph.impl.FakeRootMethod;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
import com.ibm.wala.ipa.modref.ModRef.ModVisitor;
import com.ibm.wala.ipa.modref.ModRef.RefVisitor;
import com.ibm.wala.shrikeBT.ConstantInstruction; import com.ibm.wala.shrikeBT.ConstantInstruction;
import com.ibm.wala.shrikeBT.ConstantInstruction.ClassToken; import com.ibm.wala.shrikeBT.ConstantInstruction.ClassToken;
import com.ibm.wala.shrikeBT.Constants; import com.ibm.wala.shrikeBT.Constants;
@ -776,4 +783,16 @@ public class JavaLanguage extends LanguageImpl implements BytecodeLanguage, Cons
return new FakeRootMethod(new FakeRootClass(ClassLoaderReference.Primordial, cha), options, cache); return new FakeRootMethod(new FakeRootClass(ClassLoaderReference.Primordial, cha), options, cache);
} }
@Override
public <T extends InstanceKey> RefVisitor<T, ? extends ExtendedHeapModel> makeRefVisitor(CGNode n, Collection<PointerKey> result,
PointerAnalysis<T> pa, ExtendedHeapModel h) {
return new RefVisitor<>(n, result, pa, h);
}
@Override
public <T extends InstanceKey> ModVisitor<T, ? extends ExtendedHeapModel> makeModVisitor(CGNode n, Collection<PointerKey> result,
PointerAnalysis<T> pa, ExtendedHeapModel h, boolean ignoreAllocHeapDefs) {
return new ModVisitor<>(n, result, h, pa, ignoreAllocHeapDefs);
}
} }

View File

@ -17,10 +17,17 @@ import com.ibm.wala.analysis.typeInference.PrimitiveType;
import com.ibm.wala.analysis.typeInference.TypeInference; import com.ibm.wala.analysis.typeInference.TypeInference;
import com.ibm.wala.cfg.InducedCFG; import com.ibm.wala.cfg.InducedCFG;
import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.Context; import com.ibm.wala.ipa.callgraph.Context;
import com.ibm.wala.ipa.callgraph.IAnalysisCacheView; import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod; import com.ibm.wala.ipa.callgraph.impl.AbstractRootMethod;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.ipa.modref.ExtendedHeapModel;
import com.ibm.wala.ipa.modref.ModRef;
import com.ibm.wala.ipa.modref.ModRef.RefVisitor;
import com.ibm.wala.shrikeCT.InvalidClassFileException; import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory; import com.ibm.wala.ssa.SSAInstructionFactory;
@ -157,4 +164,10 @@ public interface Language {
boolean modelConstant(Object o); boolean modelConstant(Object o);
<T extends InstanceKey> RefVisitor<T, ? extends ExtendedHeapModel> makeRefVisitor(CGNode n, Collection<PointerKey> result,
PointerAnalysis<T> pa, ExtendedHeapModel h);
<T extends InstanceKey> ModRef.ModVisitor<T, ? extends ExtendedHeapModel> makeModVisitor(CGNode n,
Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h,
boolean ignoreAllocHeapDefs);
} }

View File

@ -19,6 +19,7 @@ import com.ibm.wala.classLoader.IField;
import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph; import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.CallGraphTransitiveClosure; import com.ibm.wala.ipa.callgraph.CallGraphTransitiveClosure;
import com.ibm.wala.ipa.callgraph.propagation.HeapModel;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey; import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
@ -116,8 +117,14 @@ public class ModRef<T extends InstanceKey> {
} }
public ExtendedHeapModel makeHeapModel(PointerAnalysis<T> pa) { public ExtendedHeapModel makeHeapModel(PointerAnalysis<T> pa) {
return new DelegatingExtendedHeapModel(pa.getHeapModel()); HeapModel heapModel = pa.getHeapModel();
if (heapModel instanceof ExtendedHeapModel) {
return (ExtendedHeapModel) heapModel;
} else {
return new DelegatingExtendedHeapModel(heapModel);
}
} }
/** /**
* For a call graph node, what heap locations (as determined by a heap model) may it write, <b> NOT </b> including it's callees * For a call graph node, what heap locations (as determined by a heap model) may it write, <b> NOT </b> including it's callees
* transitively * transitively
@ -162,7 +169,7 @@ public class ModRef<T extends InstanceKey> {
return result; return result;
} }
protected static class RefVisitor<T extends InstanceKey, H extends ExtendedHeapModel> extends SSAInstruction.Visitor { public static class RefVisitor<T extends InstanceKey, H extends ExtendedHeapModel> extends SSAInstruction.Visitor {
protected final CGNode n; protected final CGNode n;
protected final Collection<PointerKey> result; protected final Collection<PointerKey> result;
@ -171,7 +178,7 @@ public class ModRef<T extends InstanceKey> {
protected final H h; protected final H h;
protected RefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa2, H h) { public RefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa2, H h) {
this.n = n; this.n = n;
this.result = result; this.result = result;
this.pa = pa2; this.pa = pa2;
@ -213,7 +220,7 @@ public class ModRef<T extends InstanceKey> {
} }
} }
protected static class ModVisitor<T extends InstanceKey, H extends ExtendedHeapModel> extends SSAInstruction.Visitor { public static class ModVisitor<T extends InstanceKey, H extends ExtendedHeapModel> extends SSAInstruction.Visitor {
protected final CGNode n; protected final CGNode n;
protected final Collection<PointerKey> result; protected final Collection<PointerKey> result;
@ -224,7 +231,7 @@ public class ModRef<T extends InstanceKey> {
private final boolean ignoreAllocHeapDefs; private final boolean ignoreAllocHeapDefs;
protected ModVisitor(CGNode n, Collection<PointerKey> result, H h, PointerAnalysis<T> pa, public ModVisitor(CGNode n, Collection<PointerKey> result, H h, PointerAnalysis<T> pa,
boolean ignoreAllocHeapDefs) { boolean ignoreAllocHeapDefs) {
this.n = n; this.n = n;
this.result = result; this.result = result;
@ -330,7 +337,8 @@ public class ModRef<T extends InstanceKey> {
protected ModVisitor<T, ? extends ExtendedHeapModel> makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h, protected ModVisitor<T, ? extends ExtendedHeapModel> makeModVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h,
boolean ignoreAllocHeapDefs) { boolean ignoreAllocHeapDefs) {
return new ModVisitor<>(n, result, h, pa, ignoreAllocHeapDefs); return n.getMethod().getDeclaringClass().getClassLoader().getLanguage().makeModVisitor(n, result, pa, h, ignoreAllocHeapDefs);
//return new ModVisitor<>(n, result, h, pa, ignoreAllocHeapDefs);
} }
/** /**
@ -355,7 +363,7 @@ public class ModRef<T extends InstanceKey> {
} }
protected RefVisitor<T, ? extends ExtendedHeapModel> makeRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h) { protected RefVisitor<T, ? extends ExtendedHeapModel> makeRefVisitor(CGNode n, Collection<PointerKey> result, PointerAnalysis<T> pa, ExtendedHeapModel h) {
return new RefVisitor<>(n, result, pa, h); return n.getMethod().getDeclaringClass().getClassLoader().getLanguage().makeRefVisitor(n, result, pa, h);
} }
/** /**