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> {
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);
}
@ -80,9 +80,9 @@ public class JavaScriptModRef<T extends InstanceKey> extends AstModRef<T> {
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);
}

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.js.analysis.typeInference.JSPrimitiveType;
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.JavaScriptCheckReference;
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.NewSiteReference;
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.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.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.IComparisonInstruction.Operator;
import com.ibm.wala.shrikeCT.BootstrapMethodsReader.BootstrapMethod;
@ -669,6 +678,18 @@ public class JavaScriptLoader extends CAstAbstractModuleLoader {
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;

View File

@ -21,11 +21,18 @@ import java.util.Collections;
import com.ibm.wala.analysis.typeInference.JavaPrimitiveType;
import com.ibm.wala.analysis.typeInference.PrimitiveType;
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.impl.AbstractRootMethod;
import com.ibm.wala.ipa.callgraph.impl.FakeRootClass;
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.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.ClassToken;
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);
}
@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.cfg.InducedCFG;
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.IAnalysisCacheView;
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.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.ssa.SSAInstruction;
import com.ibm.wala.ssa.SSAInstructionFactory;
@ -157,4 +164,10 @@ public interface Language {
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.CallGraph;
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.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
@ -116,8 +117,14 @@ public class ModRef<T extends InstanceKey> {
}
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
* transitively
@ -162,7 +169,7 @@ public class ModRef<T extends InstanceKey> {
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 Collection<PointerKey> result;
@ -171,7 +178,7 @@ public class ModRef<T extends InstanceKey> {
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.result = result;
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 Collection<PointerKey> result;
@ -224,7 +231,7 @@ public class ModRef<T extends InstanceKey> {
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) {
this.n = n;
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,
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) {
return new RefVisitor<>(n, result, pa, h);
return n.getMethod().getDeclaringClass().getClassLoader().getLanguage().makeRefVisitor(n, result, pa, h);
}
/**