Skip to content

Commit 9fde961

Browse files
authored
Merge pull request #2110 from MarcMil/fixes
Fix a bug where the types in Dalvik code are not accurate for floats …
2 parents e5714cb + 0fd35bf commit 9fde961

File tree

1 file changed

+32
-3
lines changed

1 file changed

+32
-3
lines changed

src/main/java/soot/dexpler/DexBody.java

+32-3
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,15 @@
9494
import soot.dexpler.tags.DoubleOpTag;
9595
import soot.dexpler.tags.FloatOpTag;
9696
import soot.dexpler.typing.DalvikTyper;
97+
import soot.jimple.AddExpr;
9798
import soot.jimple.AssignStmt;
9899
import soot.jimple.BinopExpr;
99100
import soot.jimple.CastExpr;
100101
import soot.jimple.CaughtExceptionRef;
101102
import soot.jimple.ConditionExpr;
102103
import soot.jimple.Constant;
103104
import soot.jimple.DefinitionStmt;
105+
import soot.jimple.DivExpr;
104106
import soot.jimple.DoubleConstant;
105107
import soot.jimple.EqExpr;
106108
import soot.jimple.FloatConstant;
@@ -109,9 +111,12 @@
109111
import soot.jimple.Jimple;
110112
import soot.jimple.JimpleBody;
111113
import soot.jimple.LongConstant;
114+
import soot.jimple.MulExpr;
112115
import soot.jimple.NeExpr;
113116
import soot.jimple.NullConstant;
114117
import soot.jimple.NumericConstant;
118+
import soot.jimple.RemExpr;
119+
import soot.jimple.SubExpr;
115120
import soot.jimple.internal.JIdentityStmt;
116121
import soot.jimple.toolkits.base.Aggregator;
117122
import soot.jimple.toolkits.scalar.ConditionalBranchFolder;
@@ -784,6 +789,8 @@ public Body jimplify(Body b, SootMethod m) {
784789
UnconditionalBranchFolder.v().transform(jBody);
785790
}
786791
DexFillArrayDataTransformer.v().transform(jBody);
792+
//SharedInitializationLocalSplitter destroys the inserted casts, so we have to reintroduce them
793+
convertFloatsAndDoubles(b, jimple);
787794

788795
TypeAssigner.v().transform(jBody);
789796

@@ -1005,15 +1012,37 @@ public Body jimplify(Body b, SootMethod m) {
10051012
public void convertFloatsAndDoubles(Body b, final Jimple jimple) {
10061013
UnitPatchingChain units = jBody.getUnits();
10071014
Unit u = units.getFirst();
1015+
Local convResultFloat = null;
1016+
Local convResultDouble = null;
10081017
Local[] convFloat = new Local[2], convDouble = new Local[2];
1009-
10101018
while (u != null) {
10111019
if (u instanceof AssignStmt) {
10121020
AssignStmt def = (AssignStmt) u;
10131021
Value rop = def.getRightOp();
10141022
if (rop instanceof BinopExpr) {
10151023
boolean isDouble = u.hasTag(DoubleOpTag.NAME);
10161024
boolean isFloat = u.hasTag(FloatOpTag.NAME);
1025+
if (rop instanceof AddExpr || rop instanceof SubExpr || rop instanceof MulExpr || rop instanceof DivExpr
1026+
|| rop instanceof RemExpr) {
1027+
if (isDouble) {
1028+
if (convResultDouble == null) {
1029+
convResultDouble = jimple.newLocal(freshLocalName("lclConvToDouble"), DoubleType.v());
1030+
b.getLocals().add(convResultDouble);
1031+
}
1032+
Value prev = def.getLeftOp();
1033+
def.setLeftOp(convResultDouble);
1034+
units.insertAfter(jimple.newAssignStmt(prev, jimple.newCastExpr(convResultDouble, DoubleType.v())), u);
1035+
}
1036+
if (isFloat) {
1037+
if (convResultFloat == null) {
1038+
convResultFloat = jimple.newLocal(freshLocalName("lclConvToFloat"), FloatType.v());
1039+
b.getLocals().add(convResultFloat);
1040+
}
1041+
Value prev = def.getLeftOp();
1042+
def.setLeftOp(convResultFloat);
1043+
units.insertAfter(jimple.newAssignStmt(prev, jimple.newCastExpr(convResultFloat, FloatType.v())), u);
1044+
}
1045+
}
10171046
BinopExpr bop = (BinopExpr) rop;
10181047
int idxConvVar = 0;
10191048
for (ValueBox cmp : bop.getUseBoxes()) {
@@ -1032,7 +1061,7 @@ public void convertFloatsAndDoubles(Body b, final Jimple jimple) {
10321061
if (isDouble) {
10331062
if (!(c.getType() instanceof DoubleType)) {
10341063
if (convDouble[idxConvVar] == null) {
1035-
convDouble[idxConvVar] = jimple.newLocal("lclConvToDouble" + idxConvVar, DoubleType.v());
1064+
convDouble[idxConvVar] = jimple.newLocal(freshLocalName("lclConvToDouble" + idxConvVar), DoubleType.v());
10361065
b.getLocals().add(convDouble[idxConvVar]);
10371066
}
10381067
units.insertBefore(
@@ -1043,7 +1072,7 @@ public void convertFloatsAndDoubles(Body b, final Jimple jimple) {
10431072
} else if (isFloat) {
10441073
if (!(c.getType() instanceof FloatType)) {
10451074
if (convFloat[idxConvVar] == null) {
1046-
convFloat[idxConvVar] = jimple.newLocal("lclConvToFloat" + idxConvVar, FloatType.v());
1075+
convFloat[idxConvVar] = jimple.newLocal(freshLocalName("lclConvToFloat" + idxConvVar), FloatType.v());
10471076
b.getLocals().add(convFloat[idxConvVar]);
10481077
}
10491078
units.insertBefore(

0 commit comments

Comments
 (0)