Skip to content

Commit b7e6610

Browse files
committed
Fix summary infoflow
1 parent e97a244 commit b7e6610

3 files changed

Lines changed: 49 additions & 5 deletions

File tree

soot-infoflow-summaries/src/soot/jimple/infoflow/methodSummary/generator/SummaryInfoflow.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import java.util.Collection;
44

5+
import soot.Local;
6+
import soot.jimple.infoflow.FlowDroidLocalSplitter;
57
import soot.jimple.infoflow.Infoflow;
68
import soot.jimple.infoflow.InfoflowManager;
79
import soot.jimple.infoflow.solver.IInfoflowSolver;
@@ -35,10 +37,28 @@ public InfoflowManager getManager() {
3537

3638
@Override
3739
protected void onTaintPropagationCompleted(IInfoflowSolver forwardSolver, IInfoflowSolver aliasSolver,
38-
IInfoflowSolver backwardSolver, IInfoflowSolver backwardAliasSolver) {
40+
IInfoflowSolver backwardSolver, IInfoflowSolver backwardAliasSolver) {
3941
cachedManager = this.manager;
4042
}
4143

44+
@Override
45+
protected void unsplitAllBodies() {
46+
//Since we are interested in abstractions, we must not unsplit.
47+
//This is fine for our use case
48+
}
49+
50+
@Override
51+
protected FlowDroidLocalSplitter getLocalSplitter() {
52+
return new FlowDroidLocalSplitter() {
53+
54+
@Override
55+
protected Local createClonedLocal(Local oldLocal) {
56+
//We want "normal" locals since we take deep looks into abstractions
57+
return (Local) oldLocal.clone();
58+
}
59+
};
60+
}
61+
4262
@Override
4363
protected void initializeSoot(String appPath, String libPath, Collection<String> classes) {
4464
this.libPath = libPath;

soot-infoflow/src/soot/jimple/infoflow/AbstractInfoflow.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,11 @@ private void patchCode(Body body) {
569569
if (config.isPatchInvokeDynamicInstructions()) {
570570
patchDynamicInvokeInstructions(body);
571571
}
572-
FlowDroidLocalSplitter.v().transform(body);
572+
getLocalSplitter().transform(body);
573+
}
574+
575+
protected FlowDroidLocalSplitter getLocalSplitter() {
576+
return FlowDroidLocalSplitter.v();
573577
}
574578

575579
/**
@@ -956,7 +960,7 @@ protected void runAnalysis(final ISourceSinkManager sourcesSinks, final Set<Stri
956960
}
957961
}
958962

959-
private void unsplitAllBodies() {
963+
protected void unsplitAllBodies() {
960964
for (SootClass sc : Scene.v().getClasses()) {
961965
for (SootMethod m : sc.getMethods()) {
962966
if (m.hasActiveBody()) {
@@ -987,11 +991,12 @@ private void unsplitAllBodies() {
987991
//can be a problem for FlowDroid. So, we split the locals prior to
988992
//running FlowDroid.
989993
protected void splitAllBodies(Iterator<? extends MethodOrMethodContext> it) {
990-
FlowDroidLocalSplitter splitter = FlowDroidLocalSplitter.v();
994+
FlowDroidLocalSplitter splitter = getLocalSplitter();
991995
while (it.hasNext()) {
992996
MethodOrMethodContext mc = it.next();
993997
SootMethod m = mc.method();
994-
if (m.isConcrete()) {
998+
if (m.isConcrete() && m.getTag(SplittedTag.NAME) == null) {
999+
m.addTag(SplittedTag.v());
9951000
splitter.transform(m.retrieveActiveBody());
9961001
}
9971002
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package soot.jimple.infoflow;
2+
3+
import soot.tagkit.Tag;
4+
5+
public class SplittedTag implements Tag {
6+
7+
public static final String NAME = "Splitted";
8+
private static final Tag INSTANCE = new SplittedTag();
9+
10+
@Override
11+
public String getName() {
12+
return NAME;
13+
}
14+
15+
public static Tag v() {
16+
return INSTANCE;
17+
}
18+
19+
}

0 commit comments

Comments
 (0)