pull exclusions file support into util project and then share it with
the shrike-based dynamic call graph builder so that static and dynamic graphs can be built consistently more easily.
This commit is contained in:
parent
eacfe38dbb
commit
0ccaae3b2c
|
@ -22,9 +22,9 @@ import com.ibm.wala.classLoader.ClassLoaderFactoryImpl;
|
|||
import com.ibm.wala.classLoader.ClassLoaderImpl;
|
||||
import com.ibm.wala.classLoader.IClassLoader;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
public class PolyglotClassLoaderFactory extends ClassLoaderFactoryImpl {
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ package com.ibm.wala.cast.java.translator.polyglot;
|
|||
|
||||
import com.ibm.wala.cast.java.client.JavaSourceAnalysisEngine;
|
||||
import com.ibm.wala.classLoader.ClassLoaderFactory;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
public class PolyglotJavaSourceAnalysisEngine extends JavaSourceAnalysisEngine {
|
||||
|
||||
|
|
|
@ -19,9 +19,9 @@ import com.ibm.wala.cast.java.ipa.callgraph.JavaSourceAnalysisScope;
|
|||
import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl;
|
||||
import com.ibm.wala.cast.java.translator.SourceModuleTranslator;
|
||||
import com.ibm.wala.classLoader.IClassLoader;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
public class PolyglotSourceLoaderImpl extends JavaSourceLoaderImpl {
|
||||
protected final IRTranslatorExtension fExtInfo;
|
||||
|
|
|
@ -11,7 +11,9 @@
|
|||
package com.ibm.wala.cast.java.client;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Set;
|
||||
|
||||
import com.ibm.wala.cast.ir.ssa.AstIRFactory;
|
||||
|
@ -25,7 +27,6 @@ import com.ibm.wala.ipa.callgraph.AnalysisOptions;
|
|||
import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
|
||||
import com.ibm.wala.ipa.callgraph.Entrypoint;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.callgraph.impl.Util;
|
||||
import com.ibm.wala.ipa.cha.ClassHierarchy;
|
||||
import com.ibm.wala.ipa.cha.ClassHierarchyException;
|
||||
|
@ -35,6 +36,8 @@ import com.ibm.wala.ssa.SymbolTable;
|
|||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.config.FileOfClasses;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.io.FileProvider;
|
||||
|
||||
/**
|
||||
*/
|
||||
|
@ -105,7 +108,8 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine {
|
|||
scope = makeSourceAnalysisScope();
|
||||
|
||||
if (getExclusionsFile() != null) {
|
||||
scope.setExclusions(FileOfClasses.createFileOfClasses(new File(getExclusionsFile())));
|
||||
InputStream is = new File(getExclusionsFile()).exists()? new FileInputStream(getExclusionsFile()): FileProvider.class.getClassLoader().getResourceAsStream(getExclusionsFile());
|
||||
scope.setExclusions(new FileOfClasses(is));
|
||||
}
|
||||
|
||||
for (Module M : this.systemEntries) {
|
||||
|
|
|
@ -61,7 +61,6 @@ import com.ibm.wala.classLoader.Language;
|
|||
import com.ibm.wala.classLoader.Module;
|
||||
import com.ibm.wala.classLoader.ModuleEntry;
|
||||
import com.ibm.wala.classLoader.NewSiteReference;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.shrikeCT.AnnotationsReader.ConstantElementValue;
|
||||
import com.ibm.wala.shrikeCT.AnnotationsReader.ElementValue;
|
||||
|
@ -78,6 +77,7 @@ import com.ibm.wala.types.TypeReference;
|
|||
import com.ibm.wala.types.annotations.Annotation;
|
||||
import com.ibm.wala.util.collections.HashMapFactory;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.debug.Assertions;
|
||||
import com.ibm.wala.util.strings.Atom;
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@ import com.ibm.wala.cast.tree.CAst;
|
|||
import com.ibm.wala.cast.tree.CAstEntity;
|
||||
import com.ibm.wala.cast.tree.impl.CAstImpl;
|
||||
import com.ibm.wala.cast.util.CAstPrinter;
|
||||
import com.ibm.wala.cast.util.TemporaryFile;
|
||||
import com.ibm.wala.classLoader.IClass;
|
||||
import com.ibm.wala.classLoader.IClassLoader;
|
||||
import com.ibm.wala.classLoader.Module;
|
||||
|
@ -37,6 +36,7 @@ import com.ibm.wala.classLoader.SourceModule;
|
|||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.TypeName;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
import com.ibm.wala.util.io.TemporaryFile;
|
||||
import com.ibm.wala.util.warnings.Warning;
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
package dynamicCG;
|
||||
|
||||
public class ExtraClass {
|
||||
|
||||
public ExtraClass() {
|
||||
|
||||
}
|
||||
|
||||
private static String getName() {
|
||||
return "ExtraClass";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package dynamicCG;
|
||||
|
||||
public class MainClass {
|
||||
private final Object x;
|
||||
|
||||
private MainClass(Object x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
private String toStringImpl() {
|
||||
return "mc:" + x.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return toStringImpl();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
MainClass mc = new MainClass(new ExtraClass());
|
||||
System.err.println(mc.toString());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
java\/awt\/.*
|
||||
javax\/swing\/.*
|
||||
sun\/awt\/.*
|
||||
sun\/swing\/.*
|
||||
com\/sun\/.*
|
||||
sun\/.*
|
||||
org\/netbeans\/.*
|
||||
org\/openide\/.*
|
||||
com\/ibm\/crypto\/.*
|
||||
com\/ibm\/security\/.*
|
||||
org\/apache\/xerces\/.*
|
||||
dynamicCG\/ExtraClass
|
|
@ -7,6 +7,9 @@
|
|||
<listEntry value="4"/>
|
||||
</listAttribute>
|
||||
<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
|
||||
<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
|
||||
<mapEntry key="[run]" value="org.eclipse.jdt.junit.launchconfig"/>
|
||||
</mapAttribute>
|
||||
<stringAttribute key="org.eclipse.debug.ui.ATTR_CAPTURE_IN_FILE" value="/tmp/wala.out"/>
|
||||
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=com.ibm.wala.core.tests"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
|
||||
|
|
|
@ -32,6 +32,6 @@ public class ExclusionsTest {
|
|||
ExclusionsTest.class.getClassLoader());
|
||||
TypeReference buttonRef = TypeReference.findOrCreate(ClassLoaderReference.Application,
|
||||
StringStuff.deployment2CanonicalTypeString("java.awt.Button"));
|
||||
Assert.assertTrue(scope.getExclusions().contains(buttonRef));
|
||||
Assert.assertTrue(scope.getExclusions().contains(buttonRef.getName().toString().substring(1)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,124 @@
|
|||
package com.ibm.wala.core.tests.shrike;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
|
||||
import com.ibm.wala.core.tests.util.TestConstants;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisCache;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
||||
import com.ibm.wala.ipa.callgraph.CGNode;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraph;
|
||||
import com.ibm.wala.ipa.callgraph.Entrypoint;
|
||||
import com.ibm.wala.ipa.cha.ClassHierarchy;
|
||||
import com.ibm.wala.ipa.cha.ClassHierarchyException;
|
||||
import com.ibm.wala.shrike.cg.DynamicCallGraph;
|
||||
import com.ibm.wala.shrikeBT.analysis.Analyzer.FailureException;
|
||||
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.types.MethodReference;
|
||||
import com.ibm.wala.types.Selector;
|
||||
import com.ibm.wala.types.TypeReference;
|
||||
import com.ibm.wala.util.CancelException;
|
||||
import com.ibm.wala.util.io.FileProvider;
|
||||
import com.ibm.wala.util.io.TemporaryFile;
|
||||
|
||||
public class DynamicCallGraphTests {
|
||||
|
||||
private static final URL testJarLocation = DynamicCallGraphTests.class.getClassLoader().getResource("com.ibm.wala.core.testdata_1.0.0.jar");
|
||||
|
||||
private boolean instrumentedJarBuilt = false;
|
||||
|
||||
private void instrument() throws IOException, ClassNotFoundException, InvalidClassFileException, FailureException {
|
||||
if (! instrumentedJarBuilt) {
|
||||
DynamicCallGraph.main(new String[]{testJarLocation.getPath(), "-o", "/tmp/test.jar"});
|
||||
Assert.assertTrue("expected to create /tmp/test.jar", new File("/tmp/test.jar").exists());
|
||||
instrumentedJarBuilt = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void run(String exclusionsFile) throws IOException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
|
||||
String shrikeBin = new File("../com.ibm.wala.shrike/bin/").getCanonicalPath();
|
||||
String utilBin = new File("../com.ibm.wala.util/bin/").getCanonicalPath();
|
||||
URLClassLoader jcl = new URLClassLoader(new URL[]{ new URL("file:///tmp/test.jar"), new URL("file://" + shrikeBin + "/"), new URL("file://" + utilBin + "/") }, DynamicCallGraphTests.class.getClassLoader().getParent());
|
||||
|
||||
Class<?> testClass = jcl.loadClass("dynamicCG.MainClass");
|
||||
Assert.assertNotNull(testClass);
|
||||
Method testMain = testClass.getDeclaredMethod("main", String[].class);
|
||||
Assert.assertNotNull(testMain);
|
||||
|
||||
System.setProperty("dynamicCGFile", "/tmp/cg.txt");
|
||||
if (exclusionsFile != null) {
|
||||
File tmpFile = TemporaryFile.urlToFile("exclusions.txt", getClass().getClassLoader().getResource(exclusionsFile));
|
||||
System.setProperty("dynamicCGFilter", tmpFile.getCanonicalPath());
|
||||
}
|
||||
testMain.invoke(null, (Object)new String[0]);
|
||||
Assert.assertTrue("expected to create call graph", new File(System.getProperty("dynamicCGFile")).exists());
|
||||
}
|
||||
|
||||
private CallGraph staticCG(String exclusionsFile) throws IOException, ClassHierarchyException, IllegalArgumentException, CancelException {
|
||||
AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, exclusionsFile != null? exclusionsFile: CallGraphTestUtil.REGRESSION_EXCLUSIONS);
|
||||
ClassHierarchy cha = ClassHierarchy.make(scope);
|
||||
Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha, "LdynamicCG/MainClass");
|
||||
AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints);
|
||||
return CallGraphTestUtil.buildZeroOneCFA(options, new AnalysisCache(), cha, scope, false);
|
||||
}
|
||||
|
||||
private void check(CallGraph staticCG) throws IOException {
|
||||
BufferedReader dynamicEdgesFile = new BufferedReader(new FileReader(System.getProperty("dynamicCGFile")));
|
||||
String line;
|
||||
while ((line = dynamicEdgesFile.readLine()) != null) {
|
||||
StringTokenizer edge = new StringTokenizer(line, "\t");
|
||||
|
||||
CGNode caller;
|
||||
String callerClass = edge.nextToken();
|
||||
if ("root".equals(callerClass)) {
|
||||
caller = staticCG.getFakeRootNode();
|
||||
} else {
|
||||
String callerMethod = edge.nextToken();
|
||||
Set<CGNode> nodes = staticCG.getNodes(MethodReference.findOrCreate(TypeReference.findOrCreate(ClassLoaderReference.Application, "L" + callerClass), Selector.make(callerMethod)));
|
||||
Assert.assertEquals(1, nodes.size());
|
||||
caller = nodes.iterator().next();
|
||||
}
|
||||
|
||||
String calleeClass = edge.nextToken();
|
||||
String calleeMethod = edge.nextToken();
|
||||
Set<CGNode> nodes = staticCG.getNodes(MethodReference.findOrCreate(TypeReference.findOrCreate(ClassLoaderReference.Application, "L" + calleeClass), Selector.make(calleeMethod)));
|
||||
Assert.assertEquals(1, nodes.size());
|
||||
CGNode callee = nodes.iterator().next();
|
||||
|
||||
Assert.assertTrue(staticCG.getPossibleSites(caller, callee).hasNext());
|
||||
System.err.println("found expected edge" + caller + " --> " + callee);
|
||||
}
|
||||
|
||||
dynamicEdgesFile.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGraph() throws IOException, ClassNotFoundException, InvalidClassFileException, FailureException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, ClassHierarchyException, CancelException {
|
||||
instrument();
|
||||
run(null);
|
||||
CallGraph staticCG = staticCG(null);
|
||||
check(staticCG);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExclusions() throws IOException, ClassNotFoundException, InvalidClassFileException, FailureException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, ClassHierarchyException, CancelException {
|
||||
instrument();
|
||||
run("ShrikeTestExclusions.txt");
|
||||
CallGraph staticCG = staticCG("ShrikeTestExclusions.txt");
|
||||
check(staticCG);
|
||||
}
|
||||
}
|
|
@ -142,7 +142,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = computeBackwardSlice;
|
||||
dumpSlice(slice);
|
||||
|
||||
Assert.assertEquals(9, countNormals(slice));
|
||||
Assert.assertEquals(slice.toString(), 9, countNormals(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -164,7 +164,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(1, countAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countAllocations(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -187,7 +187,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeForwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(4, slice.size());
|
||||
Assert.assertEquals(slice.toString(), 4, slice.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -210,7 +210,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeForwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(7, slice.size());
|
||||
Assert.assertEquals(slice.toString(), 7, slice.size());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -271,7 +271,7 @@ public class SlicerTest {
|
|||
// should only get 4 statements total when ignoring control dependences completely
|
||||
slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
Assert.assertEquals(4, slice.size());
|
||||
Assert.assertEquals(slice.toString(), 4, slice.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -294,7 +294,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
|
||||
ControlDependenceOptions.FULL);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(2, countConditionals(slice));
|
||||
Assert.assertEquals(slice.toString(), 2, countConditionals(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -317,7 +317,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
|
||||
ControlDependenceOptions.FULL);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(1, countConditionals(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countConditionals(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -340,7 +340,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
|
||||
ControlDependenceOptions.FULL);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(0, countConditionals(slice));
|
||||
Assert.assertEquals(slice.toString(), 0, countConditionals(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -370,7 +370,7 @@ public class SlicerTest {
|
|||
slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.FULL);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(1, countConditionals(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countConditionals(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -394,7 +394,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeForwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
|
||||
ControlDependenceOptions.NO_EXCEPTIONAL_EDGES);
|
||||
dumpSlice(slice);
|
||||
Assert.assertTrue(slice.size() > 1);
|
||||
Assert.assertTrue(slice.toString(), slice.size() > 1);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -418,7 +418,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeForwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
|
||||
ControlDependenceOptions.NO_EXCEPTIONAL_EDGES);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(2, countInvokes(slice));
|
||||
Assert.assertEquals(slice.toString(), 2, countInvokes(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -441,7 +441,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(1, countAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countAllocations(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -464,8 +464,8 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(2, countAllocations(slice));
|
||||
Assert.assertEquals(1, countAloads(slice));
|
||||
Assert.assertEquals(slice.toString(), 2, countAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countAloads(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -488,8 +488,8 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(2, countAllocations(slice));
|
||||
Assert.assertEquals(1, countPutfields(slice));
|
||||
Assert.assertEquals(slice.toString(), 2, countAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countPutfields(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -522,8 +522,8 @@ public class SlicerTest {
|
|||
DataDependenceOptions.NO_BASE_PTRS, ControlDependenceOptions.NONE);
|
||||
slice = computeBackwardSlice;
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(2, countAllocations(slice));
|
||||
Assert.assertEquals(1, countPutfields(slice));
|
||||
Assert.assertEquals(slice.toString(), 2, countAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countPutfields(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -546,9 +546,9 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(1, countAllocations(slice));
|
||||
Assert.assertEquals(2, countPutstatics(slice));
|
||||
Assert.assertEquals(2, countGetstatics(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 2, countPutstatics(slice));
|
||||
Assert.assertEquals(slice.toString(), 2, countGetstatics(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -571,7 +571,7 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(2, countAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 2, countAllocations(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -595,8 +595,8 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(3, countAllocations(slice));
|
||||
Assert.assertEquals(2, countPutfields(slice));
|
||||
Assert.assertEquals(slice.toString(), 3, countAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 2, countPutfields(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -622,8 +622,8 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, pcg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.FULL);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(0, countAllocations(slice));
|
||||
Assert.assertEquals(1, countPutfields(slice));
|
||||
Assert.assertEquals(slice.toString(), 0, countAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countPutfields(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -646,9 +646,9 @@ public class SlicerTest {
|
|||
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
|
||||
ControlDependenceOptions.NONE);
|
||||
dumpSlice(slice);
|
||||
Assert.assertEquals(1, countApplicationAllocations(slice));
|
||||
Assert.assertEquals(1, countThrows(slice));
|
||||
Assert.assertEquals(1, countGetfields(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countApplicationAllocations(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countThrows(slice));
|
||||
Assert.assertEquals(slice.toString(), 1, countGetfields(slice));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -15,10 +15,10 @@ import java.lang.reflect.Constructor;
|
|||
import java.util.HashMap;
|
||||
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.util.collections.HashMapFactory;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.warnings.Warning;
|
||||
import com.ibm.wala.util.warnings.Warnings;
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@ import java.util.TreeSet;
|
|||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarInputStream;
|
||||
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.shrikeCT.ClassReader;
|
||||
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
||||
|
@ -39,6 +38,7 @@ import com.ibm.wala.util.collections.HashMapFactory;
|
|||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.collections.Iterator2Collection;
|
||||
import com.ibm.wala.util.collections.Iterator2Iterable;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.io.FileProvider;
|
||||
import com.ibm.wala.util.io.FileSuffixes;
|
||||
import com.ibm.wala.util.shrike.ShrikeClassReaderHandle;
|
||||
|
|
|
@ -27,7 +27,6 @@ import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
|||
import com.ibm.wala.ipa.callgraph.CallGraph;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
|
||||
import com.ibm.wala.ipa.callgraph.Entrypoint;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.callgraph.impl.Util;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
|
||||
import com.ibm.wala.ipa.cha.ClassHierarchy;
|
||||
|
@ -38,6 +37,7 @@ import com.ibm.wala.types.ClassLoaderReference;
|
|||
import com.ibm.wala.util.CancelException;
|
||||
import com.ibm.wala.util.MonitorUtil.IProgressMonitor;
|
||||
import com.ibm.wala.util.config.AnalysisScopeReader;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.debug.Assertions;
|
||||
import com.ibm.wala.util.io.FileProvider;
|
||||
|
||||
|
|
|
@ -34,7 +34,6 @@ import com.ibm.wala.classLoader.Language;
|
|||
import com.ibm.wala.classLoader.Module;
|
||||
import com.ibm.wala.classLoader.SourceDirectoryTreeModule;
|
||||
import com.ibm.wala.classLoader.SourceFileModule;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.types.Descriptor;
|
||||
|
@ -45,6 +44,7 @@ import com.ibm.wala.util.PlatformUtil;
|
|||
import com.ibm.wala.util.collections.HashMapFactory;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.collections.MapUtil;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.debug.Assertions;
|
||||
import com.ibm.wala.util.strings.Atom;
|
||||
import com.ibm.wala.util.strings.ImmutableByteArray;
|
||||
|
|
|
@ -14,8 +14,8 @@ import java.io.IOException;
|
|||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.util.config.AnalysisScopeReader;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
/**
|
||||
* A serializable version of {@link AnalysisScope}. Note: any information about the array class loader is lost using this
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2002 - 2006 IBM Corporation.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package com.ibm.wala.ipa.callgraph.impl;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
import com.ibm.wala.classLoader.IClass;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.TypeReference;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
|
||||
/**
|
||||
* Logically, a set of {@link IClass}.
|
||||
*
|
||||
* TODO: why does this not extend {@link Set}? Is there a good reason anymore?
|
||||
*/
|
||||
public abstract class SetOfClasses implements Serializable {
|
||||
|
||||
public abstract boolean contains(String klassName);
|
||||
|
||||
public abstract boolean contains(TypeReference klass);
|
||||
|
||||
/**
|
||||
* Iterate all classes in the given hierarchy that this set contains.
|
||||
*
|
||||
* @throws IllegalArgumentException if hierarchy is null
|
||||
*/
|
||||
public Iterator<IClass> iterator(IClassHierarchy hierarchy) {
|
||||
if (hierarchy == null) {
|
||||
throw new IllegalArgumentException("hierarchy is null");
|
||||
}
|
||||
HashSet<IClass> result = HashSetFactory.make();
|
||||
for (IClass klass : hierarchy) {
|
||||
if (contains(klass.getReference())) {
|
||||
result.add(klass);
|
||||
}
|
||||
}
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
public abstract void add(IClass klass);
|
||||
|
||||
}
|
|
@ -14,12 +14,12 @@ import java.util.Collection;
|
|||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.AbstractFieldPointerKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.StaticFieldKey;
|
||||
import com.ibm.wala.types.TypeReference;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.debug.Assertions;
|
||||
|
||||
/**
|
||||
|
@ -53,7 +53,7 @@ public class HeapExclusions {
|
|||
if (p instanceof AbstractFieldPointerKey) {
|
||||
AbstractFieldPointerKey f = (AbstractFieldPointerKey) p;
|
||||
if (f.getInstanceKey().getConcreteType() != null) {
|
||||
if (!set.contains(f.getInstanceKey().getConcreteType().getReference())) {
|
||||
if (!set.contains(f.getInstanceKey().getConcreteType().getReference().getName().toString().substring(1))) {
|
||||
result.add(p);
|
||||
if (VERBOSE) {
|
||||
verboseAction(p);
|
||||
|
@ -64,7 +64,7 @@ public class HeapExclusions {
|
|||
}
|
||||
} else if (p instanceof StaticFieldKey) {
|
||||
StaticFieldKey sf = (StaticFieldKey) p;
|
||||
if (!set.contains(sf.getField().getDeclaringClass().getReference())) {
|
||||
if (!set.contains(sf.getField().getDeclaringClass().getReference().getName().toString().substring(1))) {
|
||||
result.add(p);
|
||||
if (VERBOSE) {
|
||||
verboseAction(p);
|
||||
|
@ -102,7 +102,7 @@ public class HeapExclusions {
|
|||
|
||||
public boolean excludes(PointerKey pk) {
|
||||
TypeReference t = getType(pk);
|
||||
return (t == null) ? false : set.contains(t);
|
||||
return (t == null) ? false : set.contains(t.getName().toString().substring(1));
|
||||
}
|
||||
|
||||
public static TypeReference getType(PointerKey pk) {
|
||||
|
|
|
@ -25,7 +25,6 @@ import com.ibm.wala.classLoader.CallSiteReference;
|
|||
import com.ibm.wala.classLoader.IClass;
|
||||
import com.ibm.wala.ipa.callgraph.CGNode;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraph;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
|
||||
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
|
||||
import com.ibm.wala.ipa.cfg.ExceptionPrunedCFG;
|
||||
|
@ -60,6 +59,7 @@ import com.ibm.wala.util.collections.HashSetFactory;
|
|||
import com.ibm.wala.util.collections.Iterator2Collection;
|
||||
import com.ibm.wala.util.collections.Iterator2Iterable;
|
||||
import com.ibm.wala.util.collections.MapUtil;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.debug.Assertions;
|
||||
import com.ibm.wala.util.debug.UnimplementedError;
|
||||
import com.ibm.wala.util.graph.NumberedGraph;
|
||||
|
@ -581,19 +581,13 @@ public class PDG implements NumberedGraph<Statement> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void add(IClass klass) {
|
||||
public void add(String klass) {
|
||||
Assertions.UNREACHABLE();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(String klassName) {
|
||||
Assertions.UNREACHABLE();
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(TypeReference klass) {
|
||||
return t.equals(klass);
|
||||
return t.getName().toString().substring(1).equals(klassName);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -613,19 +607,13 @@ public class PDG implements NumberedGraph<Statement> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void add(IClass klass) {
|
||||
public void add(String klass) {
|
||||
Assertions.UNREACHABLE();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(String klassName) {
|
||||
Assertions.UNREACHABLE();
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(TypeReference klass) {
|
||||
return !set.contains(klass);
|
||||
return !set.contains(klassName);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,12 +22,12 @@ import com.ibm.wala.classLoader.IClassLoader;
|
|||
import com.ibm.wala.classLoader.IMethod;
|
||||
import com.ibm.wala.classLoader.Language;
|
||||
import com.ibm.wala.classLoader.Module;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.ssa.SSAInstructionFactory;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.types.TypeName;
|
||||
import com.ibm.wala.util.collections.HashMapFactory;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.strings.Atom;
|
||||
|
||||
/**
|
||||
|
|
|
@ -12,6 +12,7 @@ package com.ibm.wala.util.config;
|
|||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
|
@ -67,7 +68,8 @@ public class AnalysisScopeReader {
|
|||
}
|
||||
|
||||
if (exclusionsFile != null) {
|
||||
scope.setExclusions(FileOfClasses.createFileOfClasses(exclusionsFile));
|
||||
InputStream fs = exclusionsFile.exists()? new FileInputStream(exclusionsFile): FileProvider.class.getClassLoader().getResourceAsStream(exclusionsFile.getName());
|
||||
scope.setExclusions(new FileOfClasses(fs));
|
||||
}
|
||||
|
||||
} finally {
|
||||
|
|
|
@ -56,9 +56,9 @@ import com.ibm.wala.ipa.callgraph.AnalysisCache;
|
|||
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
public class JDTJavaSourceAnalysisEngine extends EclipseProjectSourceAnalysisEngine<IJavaProject> {
|
||||
|
||||
|
|
|
@ -44,9 +44,9 @@ import com.ibm.wala.classLoader.ClassLoaderFactoryImpl;
|
|||
import com.ibm.wala.classLoader.ClassLoaderImpl;
|
||||
import com.ibm.wala.classLoader.IClassLoader;
|
||||
import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
public class JDTClassLoaderFactory extends ClassLoaderFactoryImpl {
|
||||
|
||||
|
|
|
@ -42,9 +42,9 @@ import java.io.IOException;
|
|||
import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl;
|
||||
import com.ibm.wala.cast.java.translator.SourceModuleTranslator;
|
||||
import com.ibm.wala.classLoader.IClassLoader;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
public class JDTSourceLoaderImpl extends JavaSourceLoaderImpl {
|
||||
|
||||
|
|
|
@ -46,13 +46,13 @@ import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
|||
import com.ibm.wala.ipa.callgraph.CallGraph;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
|
||||
import com.ibm.wala.ipa.callgraph.Entrypoint;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.types.ClassLoaderReference;
|
||||
import com.ibm.wala.util.CancelException;
|
||||
import com.ibm.wala.util.NullProgressMonitor;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
import com.ibm.wala.util.functions.Function;
|
||||
|
||||
public class EclipseJavaScriptAnalysisEngine extends EclipseProjectSourceAnalysisEngine<IJavaScriptProject> {
|
||||
|
|
|
@ -21,10 +21,10 @@ import com.ibm.wala.ide.util.JavaScriptEclipseProjectPath;
|
|||
import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
||||
import com.ibm.wala.ipa.callgraph.CallGraph;
|
||||
import com.ibm.wala.ipa.callgraph.Entrypoint;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.util.CancelException;
|
||||
import com.ibm.wala.util.collections.HashSetFactory;
|
||||
import com.ibm.wala.util.collections.Pair;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
public class EclipseWebAnalysisEngine extends EclipseJavaScriptAnalysisEngine {
|
||||
|
||||
|
|
|
@ -11,7 +11,9 @@
|
|||
package com.ibm.wala.ide.client;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import org.eclipse.core.resources.ResourcesPlugin;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
@ -25,6 +27,7 @@ import com.ibm.wala.ipa.callgraph.AnalysisScope;
|
|||
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
|
||||
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
||||
import com.ibm.wala.util.config.FileOfClasses;
|
||||
import com.ibm.wala.util.io.FileProvider;
|
||||
|
||||
abstract public class EclipseProjectAnalysisEngine<P> extends AbstractAnalysisEngine {
|
||||
|
||||
|
@ -55,7 +58,8 @@ abstract public class EclipseProjectAnalysisEngine<P> extends AbstractAnalysisEn
|
|||
ePath = createProjectPath(project);
|
||||
super.scope = ePath.toAnalysisScope(makeAnalysisScope());
|
||||
if (getExclusionsFile() != null) {
|
||||
scope.setExclusions(FileOfClasses.createFileOfClasses(new File(getExclusionsFile())));
|
||||
InputStream is = new File(getExclusionsFile()).exists()? new FileInputStream(getExclusionsFile()): FileProvider.class.getClassLoader().getResourceAsStream(getExclusionsFile());
|
||||
scope.setExclusions(new FileOfClasses(is));
|
||||
}
|
||||
} catch (CoreException e) {
|
||||
assert false : e.getMessage();
|
||||
|
|
|
@ -7,6 +7,7 @@ Bundle-Vendor: %providerName
|
|||
Bundle-ActivationPolicy: lazy
|
||||
Bundle-Localization: plugin
|
||||
Export-Package: com.ibm.wala.shrike.bench,
|
||||
com.ibm.wala.shrike.cg,
|
||||
com.ibm.wala.shrike.copywriter,
|
||||
com.ibm.wala.shrikeBT,
|
||||
com.ibm.wala.shrikeBT.analysis,
|
||||
|
|
|
@ -11,9 +11,10 @@
|
|||
package com.ibm.wala.shrike.cg;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import com.ibm.wala.shrikeBT.ConstantInstruction;
|
||||
import com.ibm.wala.shrikeBT.Constants;
|
||||
|
@ -26,11 +27,15 @@ import com.ibm.wala.shrikeBT.MethodEditor.Output;
|
|||
import com.ibm.wala.shrikeBT.ReturnInstruction;
|
||||
import com.ibm.wala.shrikeBT.ThrowInstruction;
|
||||
import com.ibm.wala.shrikeBT.Util;
|
||||
import com.ibm.wala.shrikeBT.analysis.Analyzer.FailureException;
|
||||
import com.ibm.wala.shrikeBT.analysis.Verifier;
|
||||
import com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter;
|
||||
import com.ibm.wala.shrikeBT.shrikeCT.OfflineInstrumenter;
|
||||
import com.ibm.wala.shrikeCT.ClassReader;
|
||||
import com.ibm.wala.shrikeCT.ClassWriter;
|
||||
import com.ibm.wala.shrikeCT.InvalidClassFileException;
|
||||
import com.ibm.wala.util.config.FileOfClasses;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
/**
|
||||
* Class files are taken as input arguments (or if there are none, from standard
|
||||
|
@ -57,9 +62,9 @@ public class DynamicCallGraph {
|
|||
|
||||
private static Class<?> runtime = Runtime.class;
|
||||
|
||||
private static Pattern filter;
|
||||
private static SetOfClasses filter;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
public static void main(String[] args) throws IOException, ClassNotFoundException, InvalidClassFileException, FailureException {
|
||||
instrumenter = new OfflineInstrumenter();
|
||||
|
||||
Writer w = new BufferedWriter(new FileWriter("report", false));
|
||||
|
@ -69,8 +74,8 @@ public class DynamicCallGraph {
|
|||
for(int i = 0; i < args.length - 1; i++) {
|
||||
if ("--runtime".equals(args[i])) {
|
||||
runtime = Class.forName(args[i+1]);
|
||||
} else if ("--filter".equals(args[i])) {
|
||||
filter = Pattern.compile(args[i+1]);
|
||||
} else if ("--exclusions".equals(args[i])) {
|
||||
filter = new FileOfClasses(new FileInputStream(args[i+1]));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -83,9 +88,9 @@ public class DynamicCallGraph {
|
|||
instrumenter.close();
|
||||
}
|
||||
|
||||
private static void doClass(final ClassInstrumenter ci, Writer w) throws Exception {
|
||||
private static void doClass(final ClassInstrumenter ci, Writer w) throws InvalidClassFileException, IOException, FailureException {
|
||||
final String className = ci.getReader().getName();
|
||||
if (filter != null && ! filter.matcher(className).find()) {
|
||||
if (filter != null && ! filter.contains(className)) {
|
||||
return;
|
||||
}
|
||||
w.write("Class: " + className + "\n");
|
||||
|
@ -114,18 +119,20 @@ public class DynamicCallGraph {
|
|||
final MethodEditor me = new MethodEditor(d);
|
||||
me.beginPass();
|
||||
|
||||
final String method = r.getName().replace('/', '.').concat(".").concat(r.getMethodName(m).concat(r.getMethodType(m)));
|
||||
final boolean isConstructor = method.contains("<init>");
|
||||
final String theClass = r.getName();
|
||||
final String theMethod = r.getMethodName(m).concat(r.getMethodType(m));
|
||||
final boolean isConstructor = theMethod.contains("<init>");
|
||||
final boolean nonStatic = !java.lang.reflect.Modifier.isStatic(r.getMethodAccessFlags(m));
|
||||
me.insertAtStart(new MethodEditor.Patch() {
|
||||
@Override
|
||||
public void emitTo(MethodEditor.Output w) {
|
||||
w.emit(ConstantInstruction.makeString(method));
|
||||
w.emit(ConstantInstruction.makeString(theClass));
|
||||
w.emit(ConstantInstruction.makeString(theMethod));
|
||||
if (nonStatic && !isConstructor)
|
||||
w.emit(LoadInstruction.make(Constants.TYPE_Object, 0)); //load this
|
||||
else
|
||||
w.emit(ConstantInstruction.make(Constants.TYPE_null, null));
|
||||
w.emit(Util.makeInvoke(runtime, "execution", new Class[] {String.class, Object.class}));
|
||||
w.emit(Util.makeInvoke(runtime, "execution", new Class[] {String.class, String.class, Object.class}));
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -135,13 +142,14 @@ public class DynamicCallGraph {
|
|||
insertBefore(new MethodEditor.Patch() {
|
||||
@Override
|
||||
public void emitTo(MethodEditor.Output w) {
|
||||
w.emit(ConstantInstruction.makeString(method));
|
||||
w.emit(ConstantInstruction.makeString(theClass));
|
||||
w.emit(ConstantInstruction.makeString(theMethod));
|
||||
if (nonStatic)
|
||||
w.emit(LoadInstruction.make(Constants.TYPE_Object, 0)); //load this
|
||||
else
|
||||
w.emit(ConstantInstruction.make(Constants.TYPE_null, null));
|
||||
w.emit(ConstantInstruction.make(0)); // false
|
||||
w.emit(Util.makeInvoke(runtime, "termination", new Class[] {String.class, Object.class, boolean.class}));
|
||||
w.emit(Util.makeInvoke(runtime, "termination", new Class[] {String.class, String.class, Object.class, boolean.class}));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -151,42 +159,47 @@ public class DynamicCallGraph {
|
|||
insertBefore(new MethodEditor.Patch() {
|
||||
@Override
|
||||
public void emitTo(Output w) {
|
||||
w.emit(ConstantInstruction.makeString(method));
|
||||
w.emit(ConstantInstruction.makeString(theClass));
|
||||
w.emit(ConstantInstruction.makeString(theMethod));
|
||||
if (nonStatic)
|
||||
w.emit(LoadInstruction.make(Constants.TYPE_Object, 0)); //load this
|
||||
else
|
||||
w.emit(ConstantInstruction.make(Constants.TYPE_null, null));
|
||||
w.emit(ConstantInstruction.make(1)); // true
|
||||
w.emit(Util.makeInvoke(runtime, "termination", new Class[] {String.class, Object.class, boolean.class}));
|
||||
w.emit(Util.makeInvoke(runtime, "termination", new Class[] {String.class, String.class, Object.class, boolean.class}));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitInvoke(IInvokeInstruction inv) {
|
||||
final String callee = Util.makeClass(inv.getClassType()) + "." + inv.getMethodName() + inv.getMethodSignature();
|
||||
final String calleeClass = inv.getClassType();
|
||||
final String calleeMethod = inv.getMethodName() + inv.getMethodSignature();
|
||||
addInstructionExceptionHandler(/*"java.lang.Throwable"*/null, new MethodEditor.Patch() {
|
||||
@Override
|
||||
public void emitTo(MethodEditor.Output w) {
|
||||
w.emit(ConstantInstruction.makeString(callee));
|
||||
w.emit(Util.makeInvoke(runtime, "pop", new Class[] {String.class}));
|
||||
w.emit(ConstantInstruction.makeString(calleeClass));
|
||||
w.emit(ConstantInstruction.makeString(calleeMethod));
|
||||
w.emit(Util.makeInvoke(runtime, "pop", new Class[] {String.class, String.class}));
|
||||
w.emit(ThrowInstruction.make(true));
|
||||
}
|
||||
});
|
||||
insertBefore(new MethodEditor.Patch() {
|
||||
@Override
|
||||
public void emitTo(MethodEditor.Output w) {
|
||||
w.emit(ConstantInstruction.makeString(callee));
|
||||
// target unknown
|
||||
w.emit(ConstantInstruction.makeString(calleeClass));
|
||||
w.emit(ConstantInstruction.makeString(calleeMethod));
|
||||
// target unknown
|
||||
w.emit(ConstantInstruction.make(Constants.TYPE_null, null));
|
||||
w.emit(Util.makeInvoke(runtime, "addToCallStack", new Class[] {String.class, Object.class}));
|
||||
w.emit(Util.makeInvoke(runtime, "addToCallStack", new Class[] {String.class, String.class, Object.class}));
|
||||
}
|
||||
});
|
||||
insertAfter(new MethodEditor.Patch() {
|
||||
@Override
|
||||
public void emitTo(MethodEditor.Output w) {
|
||||
w.emit(ConstantInstruction.makeString(callee));
|
||||
w.emit(Util.makeInvoke(runtime, "pop", new Class[] {String.class}));
|
||||
w.emit(ConstantInstruction.makeString(calleeClass));
|
||||
w.emit(ConstantInstruction.makeString(calleeMethod));
|
||||
w.emit(Util.makeInvoke(runtime, "pop", new Class[] {String.class, String.class}));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,21 +1,33 @@
|
|||
package com.ibm.wala.shrike.cg;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Stack;
|
||||
|
||||
import com.ibm.wala.util.config.FileOfClasses;
|
||||
import com.ibm.wala.util.config.SetOfClasses;
|
||||
|
||||
public class Runtime {
|
||||
private static final Runtime runtime = new Runtime(System.getProperty("dynamicCGFile"));
|
||||
private static final Runtime runtime =
|
||||
new Runtime(System.getProperty("dynamicCGFile"), System.getProperty("dynamicCGFilter"));
|
||||
|
||||
private PrintWriter output;
|
||||
private SetOfClasses filter;
|
||||
|
||||
private Stack<String> callStack;
|
||||
|
||||
private Runtime(String fileName) {
|
||||
private Runtime(String fileName, String filterFileName) {
|
||||
callStack = new Stack<String>();
|
||||
callStack.push("root");
|
||||
|
||||
try {
|
||||
filter = new FileOfClasses(new FileInputStream(filterFileName));
|
||||
} catch (Exception e) {
|
||||
filter = null;
|
||||
}
|
||||
|
||||
try {
|
||||
output = new PrintWriter(new FileWriter(fileName));
|
||||
} catch (IOException e) {
|
||||
|
@ -23,21 +35,24 @@ public class Runtime {
|
|||
}
|
||||
}
|
||||
|
||||
public static void execution(String method, Object receiver) {
|
||||
public static void execution(String klass, String method, Object receiver) {
|
||||
if (runtime.filter == null || ! runtime.filter.contains(klass)) {
|
||||
runtime.output.printf(runtime.callStack.peek() + "\t" + klass + "\t" + method + "\n");
|
||||
runtime.output.flush();
|
||||
}
|
||||
|
||||
runtime.callStack.push(klass + "\t" + method);
|
||||
}
|
||||
|
||||
public static void termination(String method, Object receiver, boolean exception) {
|
||||
|
||||
}
|
||||
|
||||
public static void pop(String method) {
|
||||
public static void termination(String klass, String method, Object receiver, boolean exception) {
|
||||
runtime.callStack.pop();
|
||||
}
|
||||
|
||||
public static void addToCallStack(String method, Object receiver) {
|
||||
runtime.output.printf(runtime.callStack.peek() + "\t" + method + "\n");
|
||||
runtime.callStack.push(method);
|
||||
runtime.output.flush();
|
||||
public static void pop(String klass, String method) {
|
||||
|
||||
}
|
||||
|
||||
public static void addToCallStack(String klass, String method, Object receiver) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ Export-Package: com.ibm.wala.dataflow.graph,
|
|||
com.ibm.wala.fixpoint,
|
||||
com.ibm.wala.util,
|
||||
com.ibm.wala.util.collections,
|
||||
com.ibm.wala.util.config,
|
||||
com.ibm.wala.util.debug,
|
||||
com.ibm.wala.util.functions,
|
||||
com.ibm.wala.util.graph,
|
||||
|
|
|
@ -11,8 +11,6 @@
|
|||
package com.ibm.wala.util.config;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
|
@ -20,11 +18,6 @@ import java.io.Serializable;
|
|||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import com.ibm.wala.classLoader.IClass;
|
||||
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
|
||||
import com.ibm.wala.types.TypeReference;
|
||||
import com.ibm.wala.util.io.FileProvider;
|
||||
|
||||
/**
|
||||
* An object which represents a set of classes read from a text file.
|
||||
*/
|
||||
|
@ -35,24 +28,11 @@ public class FileOfClasses extends SetOfClasses implements Serializable {
|
|||
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
|
||||
|
||||
private Pattern pattern = null;
|
||||
|
||||
private String regex = null;
|
||||
|
||||
private boolean needsCompile = false;
|
||||
|
||||
private FileOfClasses(File textFile) throws IOException {
|
||||
this(textFile.exists()? new FileInputStream(textFile): FileProvider.class.getClassLoader().getResourceAsStream(textFile.getName()));
|
||||
}
|
||||
|
||||
public static FileOfClasses createFileOfClasses(File textFile) throws IOException {
|
||||
if (textFile == null) {
|
||||
throw new IllegalArgumentException("null textFile");
|
||||
}
|
||||
return new FileOfClasses(textFile);
|
||||
}
|
||||
|
||||
public FileOfClasses(InputStream input) throws IOException {
|
||||
if (input == null) {
|
||||
|
@ -83,20 +63,6 @@ public class FileOfClasses extends SetOfClasses implements Serializable {
|
|||
needsCompile = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(TypeReference klass) {
|
||||
if (klass == null) {
|
||||
throw new IllegalArgumentException("klass is null");
|
||||
}
|
||||
if (klass.isPrimitiveType()) {
|
||||
// can't exclude primitives
|
||||
return false;
|
||||
}
|
||||
// get rid of the initial 'L'
|
||||
final String klassName = klass.getName().toString().substring(1);
|
||||
return contains(klassName);
|
||||
}
|
||||
|
||||
/*
|
||||
* @see com.ibm.wala.ipa.callgraph.impl.SetOfClasses#contains(java.lang.String)
|
||||
*/
|
||||
|
@ -123,14 +89,14 @@ public class FileOfClasses extends SetOfClasses implements Serializable {
|
|||
* @see com.ibm.wala.ipa.callgraph.impl.SetOfClasses#add(com.ibm.wala.classLoader.IClass)
|
||||
*/
|
||||
@Override
|
||||
public void add(IClass klass) {
|
||||
public void add(String klass) {
|
||||
if (klass == null) {
|
||||
throw new IllegalArgumentException("klass is null");
|
||||
}
|
||||
if (regex == null) {
|
||||
regex = klass.getReference().getName().toString();
|
||||
regex = klass;
|
||||
} else {
|
||||
regex = regex + '|' + klass.getReference().getName().toString();
|
||||
regex = regex + '|' + klass;
|
||||
}
|
||||
needsCompile = true;
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2002 - 2006 IBM Corporation.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package com.ibm.wala.util.config;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Logically, a set of {@link IClass}.
|
||||
*
|
||||
* TODO: why does this not extend {@link Set}? Is there a good reason anymore?
|
||||
*/
|
||||
public abstract class SetOfClasses implements Serializable {
|
||||
|
||||
public abstract boolean contains(String klassName);
|
||||
|
||||
public abstract void add(String klass);
|
||||
|
||||
}
|
|
@ -8,7 +8,7 @@
|
|||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
*****************************************************************************/
|
||||
package com.ibm.wala.cast.util;
|
||||
package com.ibm.wala.util.io;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
Loading…
Reference in New Issue