From 16f736e773617482eb00d29de16646928e3a29bb Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 30 Jul 2014 23:05:39 +0400 Subject: [PATCH] core: fix missing 'catch' code --- .../dex/visitors/regions/RegionMaker.java | 5 +- .../tests/internal/others/TestIssue13.java | 100 ++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/internal/others/TestIssue13.java diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java index 754de35c..4747b102 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java @@ -571,8 +571,9 @@ public class RegionMaker { LOG.debug(ErrorsCounter.formatErrorMsg(mth, "No successors for splitter: " + splitter)); continue; } - BlockNode cross = BlockUtils.getPathCross(mth, s.get(0), handler); - if (cross != null) { + BlockNode ss = s.get(0); + BlockNode cross = BlockUtils.getPathCross(mth, ss, handler); + if (cross != null && cross != ss && cross != handler) { exits.add(cross); } } diff --git a/jadx-core/src/test/java/jadx/tests/internal/others/TestIssue13.java b/jadx-core/src/test/java/jadx/tests/internal/others/TestIssue13.java new file mode 100644 index 00000000..0d041f55 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/internal/others/TestIssue13.java @@ -0,0 +1,100 @@ +package jadx.tests.internal.others; + +import jadx.api.InternalJadxTest; +import jadx.core.dex.nodes.ClassNode; + +import java.lang.reflect.Field; +import java.util.HashMap; + +import org.junit.Test; + +import static jadx.tests.utils.JadxMatchers.containsOne; +import static org.junit.Assert.assertThat; + +public class TestIssue13 extends InternalJadxTest { + + public static class TestCls { + private static final String TAG = "Parcel"; + private static HashMap> mCreators; + + public final T test(ClassLoader loader) { + String name = readString(); + if (name == null) { + return null; + } + Parcelable.Creator creator; + synchronized (mCreators) { + HashMap map = mCreators.get(loader); + if (map == null) { + map = new HashMap(); + mCreators.put(loader, map); + } + creator = map.get(name); + if (creator == null) { + try { + Class c = loader == null ? + Class.forName(name) : Class.forName(name, true, loader); + Field f = c.getField("CREATOR"); + creator = (Parcelable.Creator) f.get(null); + } catch (IllegalAccessException e) { + Log.e(TAG, "1" + name + ", e: " + e); + throw new RuntimeException("2" + name); + } catch (ClassNotFoundException e) { + Log.e(TAG, "3" + name + ", e: " + e); + throw new RuntimeException("4" + name); + } catch (ClassCastException e) { + throw new RuntimeException("5" + name); + } catch (NoSuchFieldException e) { + throw new RuntimeException("6" + name); + } + if (creator == null) { + throw new RuntimeException("7" + name); + } + map.put(name, creator); + } + } + if (creator instanceof Parcelable.ClassLoaderCreator) { + return ((Parcelable.ClassLoaderCreator) creator).createFromParcel(this, loader); + } + return creator.createFromParcel(this); + } + + private String readString() { + return ""; + } + + private class Parcelable { + public class Creator { + public T createFromParcel(TestCls testCls) { + return null; + } + } + + public class ClassLoaderCreator extends Creator { + public T createFromParcel(TestCls testCls, ClassLoader loader) { + return null; + } + } + } + + private static class Log { + public static void e(String tag, String s) { + + } + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + System.out.println(code); + + for (int i = 1; i <= 7; i++) { + assertThat(code, containsOne("\"" + i + "\"")); + } + + // TODO: add additional checks +// assertThat(code, not(containsString("Throwable"))); + } +} -- GitLab