jadx icon indicating copy to clipboard operation
jadx copied to clipboard

Incorrect order of decompiled statements

Open bagipro opened this issue 6 years ago • 4 comments

Hi, I've decompiled an APK and it displays those things in de.number26.machete.android.ui.FragmentDisplayActivity:

    protected android.support.v4.app.Fragment mo41724a(android.content.Intent intent, java.lang.Class<? extends android.support.v4.app.Fragment> cls) {
        android.support.v4.app.Fragment fragment;
        if (intent.hasExtra("fragment_class")) {
            try {
                fragment = (android.support.v4.app.Fragment) ((java.lang.Class) getIntent().getSerializableExtra("fragment_class")).newInstance();
            } catch (java.lang.Throwable e) {
                com.n26.legacy.tracking.Track.m4400a(e);
            }
            if (fragment != null && cls != null) {
                try {
                    return (android.support.v4.app.Fragment) cls.newInstance();
                } catch (java.lang.Throwable e2) {
                    com.n26.legacy.tracking.Track.m4400a(e2);
                    return fragment;
                }
            }
        }
        fragment = null;
        return fragment != null ? fragment : fragment;
    }

So those two things seem incorrect:

        fragment = null;
        return fragment != null ? fragment : fragment;

I believe it should be assigned with null in definition:

        android.support.v4.app.Fragment fragment;

?

APK: https://drive.google.com/file/d/1x5m5wpewPebt-eYPowu7otyR0cbzPrjl/view?usp=sharing

bagipro avatar Jul 15 '18 12:07 bagipro

And similar thing in de.number26.machete.android.deeplink.DeepLinkUtils. By some reason the most code is placed to catch block, but it definitely shouldn't be over there:



    /* renamed from: a */
    public static boolean m7001a(java.lang.String str) {
        java.lang.String host;
        try {
            host = new java.net.URI(str).getHost();
            try {
                if (!com.n26.legacy.p157d.NullSafe.m4340b((java.lang.CharSequence) host)) {
                    java.lang.String str2 = f5569a;
                    java.lang.StringBuilder stringBuilder = new java.lang.StringBuilder();
                    stringBuilder.append("Is trusted domain function failed because the host in the passed url was null or empty: ");
                    stringBuilder.append(str);
                    com.n26.p098d.Logger.m3884e(str2, stringBuilder.toString());
                } else if (host.startsWith("www.")) {
                    host = host.substring(4);
                }
            } catch (java.net.URISyntaxException unused) {
                if (android.text.TextUtils.isEmpty(host)) {
                    return false;
                }
                java.lang.String[] split = host.split("\\.");
                if (split.length > 1) {
                    java.lang.StringBuilder stringBuilder2 = new java.lang.StringBuilder();
                    stringBuilder2.append(split[split.length - 2]);
                    stringBuilder2.append(".");
                    stringBuilder2.append(split[split.length - 1]);
                    host = stringBuilder2.toString();
                }
                int i = -1;
                int hashCode = host.hashCode();
                if (hashCode != 323953861) {
                    if (hashCode != 694396610) {
                        if (hashCode != 710037552) {
                            if (hashCode == 888649011 && host.equals("staging-n26.com")) {
                                i = 3;
                            }
                        } else if (host.equals("staging-number26.de")) {
                            i = 2;
                        }
                    } else if (host.equals("number26.de")) {
                        i = false;
                    }
                } else if (host.equals("n26.com")) {
                    i = true;
                }
                switch (i) {
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                        return true;
                    default:
                        return false;
                }
            }
        } catch (java.net.URISyntaxException unused2) {
            host = null;
        }
    }

bagipro avatar Jul 15 '18 12:07 bagipro

@sergey-wowwow thanks you! This is a very interesting example. A problem in strange if code flow. To produce correct java code jadx need to duplicate fragment = null part because it used in if else block and also in catch block. Until now code duplication was not needed and jadx can't restore such pattern ( Correct method code:

protected Fragment mo41724a(Intent intent, Class<? extends Fragment> cls) {
    Fragment fragment;
    if (intent.hasExtra("fragment_class")) {
        try {
            fragment = (Fragment) ((Class) getIntent().getSerializableExtra("fragment_class")).newInstance();
        } catch (Throwable e) {
            Track.m7771a(e);
            fragment = null; // duplicated code
        }
    } else {
        fragment = null; // duplicated code
    }
    if (fragment != null && cls != null) {
        try {
            return (Fragment) cls.newInstance();
        } catch (Throwable e2) {
            Track.m7771a(e2);
            return fragment;
        }
    }
    return fragment;
}

skylot avatar Jul 15 '18 16:07 skylot

@skylot The second issue is fixed by the latest commit. The first one is still reproducible

bagipro avatar Nov 26 '18 20:11 bagipro

@skylot One more similar thing de.number26.machete.android.refactor.presentation.my_account.MyAccountDeepLinkRouter


    public final void mo39484a(android.content.Intent intent) {
        io.reactivex.p839c.C9699a aVar;
        kotlin.p873e.p875b.C10004k.m48138b(intent, "intent");
        java.lang.String stringExtra = intent.getStringExtra("deep_link_action");
        if (stringExtra != null) {
            switch (stringExtra.hashCode()) {
                case -1532668199:
                    if (stringExtra.equals("taxinfo")) {
                        aVar = this.f23617c.mo39563c();
                        break;
                    }
                case -836588272:
                    if (stringExtra.equals("controlcenter/account")) {
                        aVar = this.f23616b.mo39583a();
                        break;
                    }
                case -596705568:
                    if (stringExtra.equals("controlcenter/shipping_address")) {
                        aVar = this.f23617c.mo39561a();
                        break;
                    }
                case -533465884:
                    if (stringExtra.equals("supportcenter")) {
                        aVar = m35739b(intent);
                        break;
                    }
                case -94588637:
                    if (stringExtra.equals("statistics")) {
                        aVar = this.f23615a.mo39615k();
                        break;
                    }
                case 1101921037:
                    if (stringExtra.equals("controlcenter/card")) {
                        aVar = this.f23615a.mo39610g();
                        break;
                    }
                case 1460012639:
                    if (stringExtra.equals("invite_friends")) {
                        aVar = this.f23615a.mo39609f();
                        break;
                    }
                case 1940650330:
                    if (stringExtra.equals("controlcenter/card/limits")) {
                        aVar = this.f23615a.mo39611h();
                        break;
                    }
            }
        }
        // all previous assignments are discarded :(
        aVar = de.number26.machete.android.refactor.presentation.my_account.MyAccountDeepLinkRouter.C7565a.f23619a;
        aVar.run();
    }

APK: https://drive.google.com/file/d/1c_DAUnNnv_DF-1BSdWhXeNt69W0W-Gxa/view?usp=sharing

bagipro avatar Jun 13 '19 13:06 bagipro