From c0ba420da1555e5e529f8151a7dfa6eb2191c428 Mon Sep 17 00:00:00 2001 From: Marc Miltenberger Date: Fri, 18 Oct 2024 21:46:27 +0200 Subject: [PATCH] Allow conversion in dex for float <-> int and double <-> long --- src/main/java/soot/dexpler/DexBody.java | 20 +++++++++++++++++++ .../typing/fast/TypePromotionUseVisitor.java | 6 +++++- .../toolkits/typing/fast/TypeResolver.java | 6 +++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/main/java/soot/dexpler/DexBody.java b/src/main/java/soot/dexpler/DexBody.java index 96c84219a04..a4f4047260e 100755 --- a/src/main/java/soot/dexpler/DexBody.java +++ b/src/main/java/soot/dexpler/DexBody.java @@ -70,6 +70,7 @@ import soot.DoubleType; import soot.FloatType; import soot.IntType; +import soot.IntegerType; import soot.Local; import soot.LongType; import soot.Modifier; @@ -141,6 +142,7 @@ import soot.jimple.toolkits.scalar.UnreachableCodeEliminator; import soot.jimple.toolkits.typing.fast.DefaultTypingStrategy; import soot.jimple.toolkits.typing.fast.ITypingStrategy; +import soot.jimple.toolkits.typing.fast.TypePromotionUseVisitor; import soot.options.JBOptions; import soot.options.Options; import soot.tagkit.LineNumberTag; @@ -819,6 +821,24 @@ public Body jimplify(Body b, SootMethod m) { new soot.jimple.toolkits.typing.fast.TypeResolver(jBody) { + protected soot.jimple.toolkits.typing.fast.TypePromotionUseVisitor createTypePromotionUseVisitor(JimpleBody jb, + soot.jimple.toolkits.typing.fast.Typing tg) { + return new TypePromotionUseVisitor(jb, tg) { + protected boolean allowConversion(Type ancestor, Type child) { + if ((ancestor instanceof IntegerType || ancestor instanceof FloatType) + && (child instanceof IntegerType || child instanceof FloatType)) { + return true; + } + if ((ancestor instanceof LongType || ancestor instanceof DoubleType) + && (child instanceof LongType || child instanceof DoubleType)) { + return true; + } + return super.allowConversion(ancestor, child); + } + }; + + } + @Override protected Collection reduceToAllowedTypesForLocal(Collection lcas, Local v) { Collection t = definiteConstraints.get(v); diff --git a/src/main/java/soot/jimple/toolkits/typing/fast/TypePromotionUseVisitor.java b/src/main/java/soot/jimple/toolkits/typing/fast/TypePromotionUseVisitor.java index 4ee4909554b..9970d066919 100644 --- a/src/main/java/soot/jimple/toolkits/typing/fast/TypePromotionUseVisitor.java +++ b/src/main/java/soot/jimple/toolkits/typing/fast/TypePromotionUseVisitor.java @@ -99,7 +99,7 @@ public Value visit(Value op, Type useType, Stmt stmt, boolean checkOnly) { Type t = AugEvalFunction.eval_(this.tg, op, stmt, this.jb); - if (!AugHierarchy.ancestor_(useType, t)) { + if (!allowConversion(useType, t)) { logger.error(String.format("Failed Typing in %s at statement %s: Is not cast compatible: %s <-- %s", jb.getMethod().getSignature(), stmt, useType, t)); this.fail = true; @@ -118,6 +118,10 @@ public Value visit(Value op, Type useType, Stmt stmt, boolean checkOnly) { return op; } + protected boolean allowConversion(Type ancestor, Type child) { + return AugHierarchy.ancestor_(ancestor, child); + } + @Override public boolean finish() { return this.typingChanged || this.fail; diff --git a/src/main/java/soot/jimple/toolkits/typing/fast/TypeResolver.java b/src/main/java/soot/jimple/toolkits/typing/fast/TypeResolver.java index 1e7b1b647de..ec92ceba04f 100644 --- a/src/main/java/soot/jimple/toolkits/typing/fast/TypeResolver.java +++ b/src/main/java/soot/jimple/toolkits/typing/fast/TypeResolver.java @@ -322,7 +322,7 @@ private Typing typePromotion(Typing tg) { AugEvalFunction ef = new AugEvalFunction(this.jb); AugHierarchy h = new AugHierarchy(); UseChecker uc = new UseChecker(this.jb); - TypePromotionUseVisitor uv = new TypePromotionUseVisitor(jb, tg); + TypePromotionUseVisitor uv = createTypePromotionUseVisitor(jb, tg); do { Collection sigma = this.applyAssignmentConstraints(tg, ef, h); if (sigma.isEmpty()) { @@ -351,6 +351,10 @@ private Typing typePromotion(Typing tg) { return tg; } + protected TypePromotionUseVisitor createTypePromotionUseVisitor(JimpleBody jb, Typing tg) { + return new TypePromotionUseVisitor(jb, tg); + } + protected Type convert(Type t) { if (t instanceof Integer1Type) { return booleanType;