Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
kadirayk committed Feb 21, 2023
1 parent 340ce86 commit 5912590
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 3 deletions.
9 changes: 8 additions & 1 deletion src/test/java/test/base/IDETestSetUp.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public abstract class IDETestSetUp {

protected JimpleSparseIDESolver<?, ?, ?> executeSparseStaticAnalysis(String targetTestClassName) {
setupSoot(targetTestClassName);
registerSootTransformers();
registerSparseSootTransformers();
executeSootTransformers();
if (sparseSolver == null) {
throw new NullPointerException("Something went wrong sparsely solving the IDE problem!");
Expand All @@ -47,8 +47,15 @@ private void registerSootTransformers() {
PackManager.v().getPack("wjtp").add(transform);
}

private void registerSparseSootTransformers() {
Transform transform = new Transform("wjtp.ifds", createSparseAnalysisTransformer());
PackManager.v().getPack("wjtp").add(transform);
}

protected abstract Transformer createAnalysisTransformer();

protected abstract Transformer createSparseAnalysisTransformer();

/*
* This method provides the options to soot to analyse the respecive
* classes.
Expand Down
51 changes: 49 additions & 2 deletions src/test/java/test/constant/ConstantPropagationAnalysisTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@
import java.util.List;
import java.util.Map;
import static org.junit.Assert.fail;

import heros.sparse.SparseCFGBuilder;
import org.junit.Test;
import solver.JimpleIDESolver;
import soot.*;

import soot.jimple.toolkits.ide.icfg.JimpleBasedInterproceduralCFG;
import sparse.JimpleSparseCFGBuilder;
import sparse.JimpleSparseIDESolver;
import target.constant.FunctionCall2;
import target.constant.SimpleAssignment;
import target.constant.SimpleAssignment2;
Expand All @@ -37,10 +41,46 @@ protected void internalTransform(String phaseName, Map<String, String> options)
};
}

@Override
protected Transformer createSparseAnalysisTransformer() {
return new SceneTransformer() {
@Override
protected void internalTransform(String phaseName, Map<String, String> options) {
JimpleBasedInterproceduralCFG icfg = new JimpleBasedInterproceduralCFG(false);
IDELinearConstantAnalysisProblem problem = new IDELinearConstantAnalysisProblem(icfg);
SparseCFGBuilder sparseCFGBuilder = new JimpleSparseCFGBuilder(true);
@SuppressWarnings({"rawtypes", "unchecked"})
JimpleSparseIDESolver<?, ?, ?> solver = new JimpleSparseIDESolver<>(problem, sparseCFGBuilder);
solver.solve();
IDETestSetUp.sparseSolver = solver;
}
};
}

void checkResultsAtLastStatement(JimpleIDESolver<?, ?, ? extends InterproceduralCFG<Unit, SootMethod>> analysis,
List<Pair<String, Integer>> expectedResult) {
SootMethod m = getEntryPointMethod();
Map<?, ?> res = analysis.resultsAt(m.getActiveBody().getUnits().getLast());
int correctResultCounter = 0;
for (Pair<String, Integer> expected : expectedResult) {
for (Map.Entry<?, ?> entry : res.entrySet()) {
Map.Entry<Local, Integer> e = (Map.Entry<Local, Integer>) entry;
if (expected.getO1().equals(e.getKey().getName()) && expected.getO2().intValue() == e.getValue().intValue()) {
correctResultCounter++;
}
}
}
if (correctResultCounter != expectedResult.size()) {
fail("results are not complete or correct");
}
}

void checkResultsAtLastStatement(JimpleIDESolver<?, ?, ? extends InterproceduralCFG<Unit, SootMethod>> analysis, List<Pair<String, Integer>> expectedResult) {
void checkResultsAtLastStatement(JimpleIDESolver<?, ?, ? extends InterproceduralCFG<Unit, SootMethod>> analysis,
JimpleSparseIDESolver<?, ?, ? extends InterproceduralCFG<Unit, SootMethod>> sparseAnalysis,
List<Pair<String, Integer>> expectedResult) {
SootMethod m = getEntryPointMethod();
Map<?, ?> res = analysis.resultsAt(m.getActiveBody().getUnits().getLast());
Map<?, ?> sparseRes = sparseAnalysis.resultsAt(m.getActiveBody().getUnits().getLast());
int correctResultCounter = 0;
for (Pair<String, Integer> expected : expectedResult) {
for (Map.Entry<?, ?> entry : res.entrySet()) {
Expand All @@ -49,6 +89,12 @@ void checkResultsAtLastStatement(JimpleIDESolver<?, ?, ? extends Interprocedural
correctResultCounter++;
}
}
for (Map.Entry<?, ?> entry : sparseRes.entrySet()) {
Map.Entry<Local, Integer> e = (Map.Entry<Local, Integer>) entry;
if (expected.getO1().equals(e.getKey().getName()) && expected.getO2().intValue() == e.getValue().intValue()) {
correctResultCounter++;
}
}
}
if (correctResultCounter != expectedResult.size()) {
fail("results are not complete or correct");
Expand All @@ -58,10 +104,11 @@ void checkResultsAtLastStatement(JimpleIDESolver<?, ?, ? extends Interprocedural
@Test
public void SimpleAssignment() {
JimpleIDESolver<?, ?, ? extends InterproceduralCFG<Unit, SootMethod>> analysis = executeStaticAnalysis(SimpleAssignment.class.getName());
JimpleSparseIDESolver<?, ?, ? extends InterproceduralCFG<Unit, SootMethod>> sparseAnalysis = executeSparseStaticAnalysis(SimpleAssignment.class.getName());
List<Pair<String, Integer>> expected = new ArrayList<>();
expected.add(new Pair("a", 100));
expected.add(new Pair("b", 200));
checkResultsAtLastStatement(analysis, expected);
checkResultsAtLastStatement(analysis, sparseAnalysis, expected);
}

@Test
Expand Down

0 comments on commit 5912590

Please sign in to comment.