Uglifyjs: ufuzz: `collapse_vars` bug

Created on 10 Dec 2017  路  7Comments  路  Source: mishoo/UglifyJS

// original code
// (beautified)
var a = 100, b = 10, c = 0;

for (var brake2 = 5; a++ + (1 === 1 ? a : b) && brake2 > 0; --brake2) {
    try {
        try {
            --b + ((([ , 0 ].length === 2) < "number") - (3 | "bar") != (a && (a[(c = 1 + c, 
            (22 >> NaN) / ([ , 0 ][1] && "bar") % (24..toString() != null != (a && (a.Infinity /= 25 == [ , 0 ][1]))))] = -4 | -1)) + (this >> -3));
        } finally {
            {
                var a = function f0(b) {
                    {
                        for (var brake8 = 5; a++ + [ (c = 1 + c, (Infinity <= []) % (this, 25) <= (a.b = (c = c + 1, 
                        24..toString()) || NaN - -5)), (c = 1 + c, (2 >> true | 5 > -2) >= (4 || 24..toString()) % ([ , 0 ].length === 2 == 2)), (c = 1 + c, 
                        false >> "undefined" <= {} >> -0 != (NaN, this) % ("" + -1)), (c = 1 + c, ((a && (a[(c = 1 + c, 
                        (+ -5 || "undefined" >> 5) !== ((a = Infinity !== true) ^ -1 >> null))] = 22 > true)) & "object" != NaN) <= ({} + 5 || 1 % 24..toString())) ][(c = 1 + c, 
                        a += +this % ("bar" << "") >= (1 <= -5 > ([ , 0 ].length === 2 == NaN)))] && brake8 > 0; --brake8) {
                            c = 1 + c, (("" & Infinity) >= ("function" < "number")) * ((a && (a.in = true < "foo")) | (-5 && -0));
                        }
                        {
                            var expr10 = a++ + NaN_2;
                            L385836: for (var key10 in expr10) {
                                c = 1 + c;
                                var NaN_2 = expr10[key10];
                                for (var brake11 = 5; (c = 1 + c, (null >= "foo", true * -5) > "object" / 2 << (-0 & -0)) && brake11 > 0; --brake11) {
                                    c = 1 + c, (NaN_2 && (NaN_2[(c = 1 + c, 2 / "number" ^ (NaN_2 += 38..toString() >= 3) || (NaN_2 = -5 <= 24..toString()) >= (3 ^ Infinity))] += (false, 
                                    "object"))) % (25 != 3) < ("bar" === "number", NaN_2 && (NaN_2.null += -3 < ([ , 0 ].length === 2)));
                                }
                            }
                        }
                        {
                            var brake13 = 5;
                            while (--b && --brake13 > 0) {
                                var expr14 = (c = 1 + c, (c = c + 1, false) % !"undefined" | "foo" >>> "foo" > ("" <= ([ , 0 ].length === 2)));
                                for (var key14 in expr14) {
                                    c = 1 + c, (-3 === "foo" == ("function", NaN)) <= ((25 ^ -0) === (4 !== /[a2][^e]+$/));
                                }
                            }
                        }
                    }
                    {
                        throw --b + --b;
                    }
                }(-4);
            }
            var parseInt_2 = --b + (1 === 1 ? a : b), NaN = (c = c + 1) + +b;
        }
    } catch (b) {
        {
            var parseInt_2 = --b + (b + 1 - .1 - .1 - .1), b = --b + [ --b + (--b + /[abc4]/.test((a++ + /[abc4]/.test(((c = 1 + c, 
            parseInt_2 && (parseInt_2.NaN += (1 > "number", "bar" === 22) || (parseInt_2 = 24..toString() ^ "bar" && (c = c + 1, 
            -5)))) || b || 5).toString()) || b || 5).toString()) || a || 3).toString() ].var;
            {
                var brake20 = 5;
                while (--b + (parseInt_2 && parseInt_2[Infinity]) && --brake20 > 0) {
                    switch ([ 1 === 1 ? a : b, a++ + +((false && 3) / ("bar" - 38..toString()) || (c = c + 1, 
                    {} !== 0)), a++, a++ + (1 === 1 ? a : b), --b + (b + 1 - .1 - .1 - .1) ].null) {
                      default:
                        {}

                      case 2:
                        break;
                        break;

                      case b--:
                        (c = c + 1) + [ (c = 1 + c, (false - null) / ("" ^ undefined) - (22 + 25 < (parseInt_2 && (parseInt_2[(c = 1 + c, 
                        (+"" | (true || "undefined")) >> (5 & 3) / (25 >>> 38..toString()))] = "number" << 5)))), (c = 1 + c, 
                        (0 != 22) >= ("undefined" === 24..toString()) < (("foo", 4) !== ("undefined" == 1))), (c = 1 + c, 
                        (true === this) - (true == "function") > (parseInt_2 = "bar" == -5 == (3 === 5))), (c = 1 + c, 
                        ("" * /[a2][^e]+$/, undefined < false) | delete (-4 % "object")) ][(c = c + 1) + (parseInt_2 += "" * 4 < ("function" !== Infinity) & -2 >> "" < 2 * 4)];
                        break;

                      case b--:
                        break;
                    }
                }
            }
        }
        if (--b + this) {
            switch (new function() {
                try {
                    {
                        var brake28 = 5;
                        while ((c = c + 1) + 23..toString() && --brake28 > 0) {
                            L385837: for (var brake29 = 5; (c = c + 1) + ((c = 1 + c, ("number" * 5 !== {} * "number") < (this != [ , 0 ][1] || "undefined" << "bar")) ? (c = 1 + c, 
                            (-5 % -0 == 5 / []) >>> (null % -2 ^ -3 + 38..toString())) : (c = 1 + c, (4 == "object" === (undefined === {})) << (parseInt_2 && (parseInt_2[--b + [ (c = 1 + c, 
                            (c = c + 1, 3 ^ 25) + ("object" == -5) % (4 ^ -1)), (c = 1 + c, (/[a2][^e]+$/ / -0 && void -2) - ((0 || -1) == (c = c + 1, 
                            []))), (c = 1 + c, (true == 5 && "function" > 38..toString()) ^ (parseInt_2 && (parseInt_2[a++ + parseInt_2] >>= ("number" || NaN) > ("bar" != -2)))), (c = 1 + c, 
                            /[a2][^e]+$/ << "foo" <= (-3 == "undefined") || (parseInt_2 = -3 || -4) + ("function" >>> 25)), (c = 1 + c, 
                            void "bar" | -3 % 38..toString() || ("undefined" & [ , 0 ].length === 2) - (NaN ^ -1)) ][(c = 1 + c, 
                            c = c + 1, parseInt_2 && (parseInt_2[(c = c + 1) + a--] = "bar" << /[a2][^e]+$/ & (undefined & 4)))]] = -2 >>> 25 << ([ , 0 ][1] !== null))))) && brake29 > 0; --brake29) {
                                switch (c = 1 + c, parseInt_2 = (parseInt_2 && (parseInt_2.Infinity = 0 + -0 ^ (parseInt_2 && (parseInt_2[(c = 1 + c, 
                                25 >> [ , 0 ][1] === "" > 3 != ((5 & null) == 3 < -4))] = "" / 4))), +("" - "undefined"))) {
                                  case c = 1 + c, (3 >>> -1) - "foo" / "object" && (parseInt_2 && (parseInt_2.NaN ^= 2 << "object" >= (c = c + 1, 
                                    false))):
                                    ;
                                    break;

                                  case c = 1 + c, (parseInt_2 += 22 >> 4 < -0 % -4) !== Infinity % undefined > ("foo" != 1):
                                    ;
                                    break;

                                  default:
                                    ;

                                  case c = 1 + c, 38..toString() !== -5 & this < -4 ^ (-4 ^ 0) === ("" & null):
                                    ;
                                    break;
                                }
                            }
                        }
                    }
                } catch (Math) {
                    {
                        var foo_2 = function f1() {
                        }();
                    }
                    c = c + 1;
                } finally {
                    --b + [ (c = 1 + c, ("" == undefined && true >>> 5) === ("object" != -0) % ([ , 0 ][1] === "foo")), (c = 1 + c, 
                    (-2 ^ 3 ^ (4 ^ 24..toString())) >> delete (true < NaN)), (c = 1 + c, (22 ^ 22) !== ([ , 0 ].length === 2) >> -5 ^ (25 === "function") + (parseInt_2 && (parseInt_2[(c = 1 + c, 
                    ((c = c + 1, 0) >= this - 2) % (parseInt_2 && (parseInt_2.c = "" >> -3 > "" % 3)))] += /[a2][^e]+$/ > [ , 0 ][1]))), (c = 1 + c, 
                    -(parseInt_2 -= -4 - 22 == 38..toString() >> 5)), (c = 1 + c, ("undefined" ^ -2) - (2 && NaN) && !(4 % ([ , 0 ].length === 2))) ];
                    {
                        var brake34 = 5;
                        do {
                            {
                                var expr35 = (c = 1 + c, (foo_2 && (foo_2[(c = 1 + c, (parseInt_2 && (parseInt_2[(c = 1 + c, 
                                (-5 && -1) < this - false && ~(parseInt_2 && (parseInt_2.b = (0, [ , 0 ][1]))))] ^= false >>> /[a2][^e]+$/)) + (-1 << null) && (c = c + 1, 
                                +{}))] = true / -1)) != 25 >= -3, (parseInt_2 && (parseInt_2.Infinity = "" & [ , 0 ].length === 2)) | ("" || 0));
                                for (var key35 in expr35) {
                                    c = 1 + c, foo_2 = 0 < -5 ^ {} << true | -1 * false / (([ , 0 ].length === 2) / false);
                                }
                            }
                        } while (++a && --brake34 > 0);
                    }
                }
                if (--b + [ ((c = 1 + c, (25 ^ [ , 0 ].length === 2) != 3 - -5 && this * 0 ^ (null ^ "undefined")) || a || 3).toString(), (c = c + 1) + 24..toString(), --b + {
                    1.5: (c = 1 + c, (parseInt_2 && (parseInt_2.b = {} | -2)) * (parseInt_2 && (parseInt_2.foo = "bar" % -5)) > (undefined >>> "function" ^ this == -3)),
                    var: (c = 1 + c, c = c + 1, 23..toString() >= ([ , 0 ].length === 2) ^ -0 !== 4),
                    undefined: (c = 1 + c, ~(24..toString() !== []) >> (([ , 0 ].length === 2 === 0) <= ("" && NaN))),
                    set Infinity(NaN_1) {
                        this.a = -1 >> 5;
                    },
                    "-2": (c = 1 + c, (5 >= 23..toString() >= (1 <= undefined)) % (0 & 23..toString() | "function" ^ 1))
                }.c, ((c = 1 + c, ("function" > true ^ (c = c + 1, -2)) - (("object" && null) >= (parseInt_2 /= 2 <= 22))) || 4).toString()[(c = 1 + c, 
                parseInt_2 = ("undefined" >= false || void ([ , 0 ].length === 2)) >> (c = c + 1, 
                false + "object"))] ][1 === 1 ? a : b]) {} else if (new function Infinity_2() {
                    this.a = [] + "bar" == (24..toString() !== [ , 0 ][1]);
                    c = 1 + c, (-5 >> "undefined" & [] + "function") / ((/[a2][^e]+$/ & -3) !== ("number" && "undefined"));
                    c = 1 + c, Infinity_2 && (Infinity_2.Infinity = ((-2, 5) || NaN === "number") >>> ((null || -4) ^ 25 * undefined));
                    c = 1 + c, (!-5 != (null === {})) >= (25 >>> -1 ^ "object" >> "foo");
                    c = 1 + c, void 5 / (24..toString() == NaN) / ((NaN < 2) << (24..toString() >> Infinity));
                }()) {
                    var expr44 = a++ + ((c = 1 + c, -((foo_2 && (foo_2.Infinity = [] == -5)) ^ 2 % -5)) || 6).toString()[(c = 1 + c, 
                    (-4 | "number", -1 !== 25) | (parseInt_2 && (parseInt_2[{
                        c: (c = 1 + c, (parseInt_2 && (parseInt_2[(c = c + 1) + --b] += delete 25 + ("function" & [ , 0 ].length === 2))) >>> (parseInt_2 = -5 ^ "" | (foo_2 && (foo_2[(c = 1 + c, 
                        (this - "object" || ("number", 3)) === (5 ^ null && [ , 0 ][1] - false))] = 2 >>> "undefined"))))
                    }] = -5 > undefined === ({} ^ NaN))))];
                    for (var key44 in expr44) {
                        c = 1 + c;
                        var b_1 = expr44[key44];
                        switch (c = 1 + c, ([] - Infinity && 23..toString() != 1) * (25 < "object" == ("undefined" === /[a2][^e]+$/))) {
                          case c = 1 + c, (24..toString() === -1) % (true && 38..toString()) - (-1 / "undefined" !== (3 | 5)):
                            ;
                            break;

                          case c = 1 + c, (25 === this) >= (0 != 38..toString()) ^ (22 >>> /[a2][^e]+$/) + (parseInt_2 && (parseInt_2.var += "bar" & "object")):
                            ;
                            break;

                          default:
                            ;

                          case c = 1 + c, (b_1 && (b_1.c = (/[a2][^e]+$/ ^ "object") >>> (true || Infinity))) - (0 % 1 - false / 25):
                            ;
                            break;
                        }
                    }
                }
                if ((c = c + 1) + [ a++ + b++, a++ + parseInt_2, ((c = 1 + c, + -1 / (0 !== 1) !== (/[a2][^e]+$/ !== {}) <= ({} & [ , 0 ][1])) || a || 3).toString() ]) {
                    return /[abc4]/.test((((c = 1 + c, ("function" + 24..toString() >= (2 === 4)) / (25 < null !== 0 <= true)) ? (c = 1 + c, 
                    -0 & "object" >= NaN || (parseInt_2 && (parseInt_2[(c = 1 + c, c = c + 1, "bar" >>> -4 ^ (b_1 && (b_1[(c = 1 + c, 
                    c = c + 1, ("bar" ^ [ , 0 ][1]) !== (4 == 38..toString()))] = "number" & 4)))] += "undefined" || null)) >>> ("bar" || 38..toString())) : (c = 1 + c, 
                    ("bar" <= 23..toString(), -4 - /[a2][^e]+$/) % (this >= -4 <= -5 >>> -1))) || b || 5).toString());
                }
            }()) {
              case a++ + b--:
                try {
                    c = c + 1;
                } catch (b_2) {
                    if (b |= a) {
                        for (var brake51 = 5; a++ + a-- && brake51 > 0; --brake51) {}
                    }
                    for (var brake53 = 5; a++ + (b += a) && brake53 > 0; --brake53) {
                        var a = {
                            in: (c = 1 + c, +({} >> 0) == ("number" <= 22) >> (parseInt_2 && (parseInt_2[(c = 1 + c, 
                            -3 >>> this >> (b_2 -= "number" % 3) <= !(23..toString() - NaN))] = "number" - -0))),
                            "-2": (c = 1 + c, (parseInt_2 = ("foo" == true) > delete 2) + (22 / -2 ^ 2 / 38..toString())),
                            undefined: (c = 1 + c, ((false, true) <= (-3 < undefined)) << ((parseInt_2 = 0 & 22) & (NaN, 
                            "function"))),
                            a: (c = 1 + c, void ((/[a2][^e]+$/ >= "") + undefined % 0))
                        };
                    }
                }
                break;

              case parseInt_2 && parseInt_2[0 === 1 ? a : b]:
                {
                    try {
                        c = c + 1;
                    } finally {
                        c = 1 + c, (parseInt_2 && (parseInt_2[a++ + (parseInt_2 && parseInt_2.foo)] /= this - 22 < ("bar" | "number"))) > delete (parseInt_2 && (parseInt_2[(c = 1 + c, 
                        parseInt_2 = (parseInt_2 += 24..toString() > Infinity === true < "undefined") & (5 & -5) >= (3 & Infinity))] = 5 << -3));
                        for (var brake59 = 5; (c = 1 + c, 1 % "number" << (0 !== -0) < (38..toString() <= 4 == 0 < 5)) && brake59 > 0; --brake59) {
                            c = 1 + c, (c = c + 1, c = c + 1, 4) - ((5 !== 1) <= (c = c + 1, "object"));
                        }
                    }
                    switch ([ (c = 1 + c, void (("undefined" >> true) - (false ^ NaN))), (c = 1 + c, 
                    (2 % "number" | (parseInt_2 && (parseInt_2[(c = 1 + c, parseInt_2 && (parseInt_2.in = ("undefined" & 23..toString()) % (1 % 24..toString()) < (2 <= 0 > 2 % 0)))] = -4 ^ {}))) % ~("undefined" | NaN)) ]) {
                      case --b + ((c = c + 1) + {
                            a: (c = 1 + c, parseInt_2 && (parseInt_2[a++] += (parseInt_2 && (parseInt_2[(c = 1 + c, 
                            parseInt_2 && (parseInt_2[a++ + !a] ^= (3 + undefined) * (Infinity || 24..toString()) == false << -1 <= Infinity / 24..toString()))] = [ , 0 ][1] != 0)) << (-5 && 2) & (parseInt_2 = false % "number" % (-3 != 2)))),
                            "-2": (c = 1 + c, void -5 >> (-4 && "function") >>> ([ , 0 ].length === 2 | [ , 0 ].length === 2, 
                            NaN ^ "number")),
                            null: (c = 1 + c, -0 != 22 && 25 >>> -1 || (-2 >> [ , 0 ][1]) / (-4 || "object")),
                            b: (c = 1 + c, ((24..toString() && "bar") <= [ , 0 ][1] << 0) >> ((-3 != {}) << (-3 < /[a2][^e]+$/)))
                        }.Infinity || 7).toString()[delete ((3 ^ 22) + (false != 3) & (c = c + 1, NaN) == !([ , 0 ].length === 2))]:
                        if (c = 1 + c, (NaN - "function" || 5 && []) - (false == this || delete 2)) {
                            c = 1 + c, (23..toString() >>> "undefined" > (parseInt_2 = -5 || undefined)) >> ({} <= 23..toString(), 
                            "number" >>> NaN);
                        } else {
                            c = 1 + c, NaN > 5 & 5 * -5 ^ ([] <= 4 | (-5, [ , 0 ].length === 2));
                        }
                        var foo_2 = (c = 1 + c, parseInt_2 /= ([] + 38..toString()) * ({} - NaN) >= ([ , 0 ].length === 2 ^ -4) >> (-5 ^ -4));
                        break;

                      case (c = c + 1) + (foo_2 && foo_2[{
                            NaN: (c = 1 + c, (parseInt_2 && (parseInt_2[a++ + (c = 1 + c, (foo_2 && (foo_2[-2] >>>= (parseInt_2 && (parseInt_2.c = /[a2][^e]+$/ << this)) & 2 << 1)) == ((parseInt_2 >>= "function" ^ 2) ^ undefined << 24..toString()))] += ({} | 25) % ([ , 0 ][1] > false))) == ("" ^ "bar") / (false - "bar")),
                            0: (c = 1 + c, (NaN << /[a2][^e]+$/ == "object" + NaN) > (4 / 24..toString() < 0 + "number")),
                            c: (c = 1 + c, -1 + [] == /[a2][^e]+$/ + "foo" & (-2 ^ []) == (c = c + 1, 1)),
                            0: (c = 1 + c, 38..toString() > 1 !== ("" ^ -3) & (false | -0) < ~-1)
                        }.in]):
                        var parseInt_2 = (c = 1 + c, "object" !== -3 != (5 | {}) || (23..toString() & true) >>> (25 || "object"));
                        break;

                      default:
                      case --b + {
                            "\t": (c = 1 + c, (undefined >>> "bar" > "function" >> undefined) + (("number", 
                            22) === (5 != 22))),
                            c: (c = 1 + c, (parseInt_2 && (parseInt_2.foo = (5 | this) * ("bar" || null))) | ([ , 0 ].length === 2) >> -0 == -5 >>> "number"),
                            var: (c = 1 + c, (foo_2 && (foo_2[(c = c + 1) + (b -= a)] -= ("foo" | 0) !== (foo_2 = [ , 0 ][1] || []))) >>> (c = c + 1, 
                            undefined / "")),
                            foo: (c = 1 + c, !-1 / (true + "number") + ((this >= "object") - ({} != "bar"))),
                            0: (c = 1 + c, 2 * 5 >> (c = c + 1, undefined) << (("undefined" || 25) ^ 3 != null))
                        }[(c = 1 + c, "function" <= 4 <= (4 ^ -4) != (4 >= 1 != 4 - -1))]:
                        c = c + 1;
                        if (c = 1 + c, (null >= this) + (parseInt_2 = "function" < 38..toString()) > (("bar" === false) <= (22, 
                        "number"))) {
                            c = 1 + c, (null | 24..toString()) - (-2 == [ , 0 ][1]), (undefined <= /[a2][^e]+$/) * void 0;
                        } else {
                            c = 1 + c, (1 != NaN) >> (0 >> 24..toString()) <= (c = c + 1, 23..toString()) >>> undefined - -1;
                        }
                        break;
                    }
                    {
                        var brake71 = 5;
                        L385838: do {
                            a++ + ((c = 1 + c, 38..toString() * false % (38..toString() >>> null) !== (foo_2 &= "number" * "function" >> ~undefined)) ? (c = 1 + c, 
                            (23..toString() > "function" && [ , 0 ][1] > -5) ^ (parseInt_2 && (parseInt_2[false] = delete 1 - /[a2][^e]+$/ / this))) : (c = 1 + c, 
                            (38..toString() !== true) >= 5 >> -5 == ("undefined" != -2 != [] * 1)));
                        } while ((0 === 1 ? a : b) && --brake71 > 0);
                    }
                    for (var brake73 = 5; a++ + (parseInt_2 && (parseInt_2[new function() {
                        this[-5] += "foo" % undefined ^ (c = c + 1, "undefined");
                        this.b += 0 / -2 == (parseInt_2 && (parseInt_2.null = undefined != NaN));
                    }()] = parseInt_2 && (parseInt_2.b = (24..toString(), 25) << "" % -2) && (25 || NaN) + (22 << -5))) && brake73 > 0; --brake73) {
                        try {
                            if (c = 1 + c, ((parseInt_2 && (parseInt_2.in ^= (-0, "bar"))) | "undefined" << -4) == (1 === 2 ^ delete 22)) {
                                c = 1 + c, (false === -0 === ("function" != false)) < (Infinity >> 1 != (parseInt_2 ^= {} - "foo"));
                            } else {
                                c = 1 + c, foo_2 && (foo_2.in += (null < -4) * ("bar" && -2)) || [] & /[a2][^e]+$/ & -3 * 22;
                            }
                        } catch (foo_1) {
                            c = 1 + c, -Infinity << -5 - -5 ^ (4 == 5) >>> (NaN << 22);
                            c = 1 + c, foo_2 = (23..toString() & "number") >>> (4 === 24..toString()) >> (1 <= "object" == (1, 
                            -2));
                        }
                    }
                }
                break;

              case [ delete 25 >> ([ , 0 ][1] ^ false) | (5 >> -5) - (23..toString() < 4), (c = c + 1) + [ parseInt_2 && parseInt_2[!((24..toString() >> ([ , 0 ].length === 2)) + ("bar", 
                [ , 0 ].length === 2) <= (Infinity >= /[a2][^e]+$/ & [] == -5))], foo_2, !function Math_2() {
                    c = 1 + c, (null === "bar") % ([ , 0 ][1] || undefined) && (c = c + 1, -3) << (/[a2][^e]+$/ & 22);
                    c = 1 + c, (-1 > 22 & 1 + -4) < (parseInt_2 && (parseInt_2[[ (c = 1 + c, (null / "number", 
                    25 & 25) % (22 >= 0 >= (undefined == 24..toString()))), (c = 1 + c, (1 && "undefined") << (4 | -5) || ([ , 0 ].length === 2 || "bar") <= (null, 
                    1)), (c = 1 + c, (24..toString() !== 0) >= (c = c + 1, /[a2][^e]+$/) <= ("function" < 38..toString() <= (2 <= 0))), (c = 1 + c, 
                    c = c + 1, undefined, "foo" | "", (5 << -4) * (c = c + 1, 24..toString())), (c = 1 + c, 
                    (22 == null) / (1 < -0) !== (parseInt_2 |= (3 >> ([ , 0 ].length === 2)) / (true < 4))) ].null] += (parseInt_2 && (parseInt_2.var = "bar" + 38..toString())) >>> (-1 << this)));
                }(), (c = c + 1) + parseInt_2, [ (c = 1 + c, -(-3 + [ , 0 ][1] > "" / 5)), (c = 1 + c, 
                c = c + 1, ([ , 0 ].length === 2) << this <= (4 === false)), (c = 1 + c, ((Infinity & null) <= (foo_2 && (foo_2.foo += "object" + 4))) >> (5 << "foo") / (parseInt_2 && (parseInt_2.undefined = "" - null))) ][(c = c + 1) + (1 === 1 ? a : b)] ].in, (c = c + 1) + [ (c = c + 1) + true, a++ + [ (c = 1 + c, 
                4 >>> 23..toString() == (c = c + 1, true) === (c = c + 1, -0, -5 ^ "bar")), (c = 1 + c, 
                -1 % /[a2][^e]+$/ != (22 === [ , 0 ][1]) == (undefined <= "foo" & 24..toString() - "foo")), (c = 1 + c, 
                +(38..toString() === [] | {} / "object")), (c = 1 + c, ([ , 0 ].length === 2) % 5 >> ("function" != 24..toString()), 
                foo_2 && (foo_2[--b + void function() {
                }()] = -5 == 3 && "number" << -1)), (c = 1 + c, ([ , 0 ][1] == false || -5 * -3) ^ (5 > "foo") - (this - "bar")) ], a++ + 25 ] ]:
                break;

              case a++ + -2:
                {
                    var foo = function f2(foo_1) {
                        function f3(a, foo) {
                            c = 1 + c, ("undefined" >>> undefined && "object" % 23..toString()) + (parseInt_2 && (parseInt_2.a = (parseInt_2 && (parseInt_2[(c = 1 + c, 
                            (5 < /[a2][^e]+$/) * ({} / -3) === (parseInt_2 && (parseInt_2[b = a] ^= ("object" & "function") !== "object" >> {})))] = -2 > ([ , 0 ].length === 2))) - (c = c + 1, 
                            25)));
                            c = 1 + c, (parseInt_2 && (parseInt_2.c = -4 << 4)) + (c = c + 1, null) >>> (foo_2 && (foo_2.b = undefined === null)) + (foo_2 && (foo_2.undefined = undefined * "foo"));
                        }
                        var Math_2 = f3();
                        function f4(bar, b, b) {
                            c = 1 + c, (false ^ [ , 0 ].length === 2) >= (false >= "function") != ({}, null, 
                            -1 == 1);
                            c = 1 + c, !("function" + ([ , 0 ].length === 2)) != (foo_2 && (foo_2[a++ + (Math_2 && Math_2.null)] += 2 < NaN ^ -2 << {}));
                        }
                        var Math_1 = f4();
                        function f5() {
                            c = 1 + c, void 25 >= (/[a2][^e]+$/ & "number") != (0 > 24..toString(), 2 | undefined);
                            c = 1 + c, ((undefined ^ -2) === -3 << "") >> ((undefined || this) && -1 % 25);
                        }
                        var b_1 = f5((c = 1 + c, (undefined && -0 || "undefined" >>> ([ , 0 ].length === 2)) >>> (22 << 5) + (null == "object")));
                        function f6() {
                            c = 1 + c, (38..toString() <= "" || 4 % -4) ^ ("" !== /[a2][^e]+$/) <= (-2 != -5);
                            c = 1 + c, (Infinity >>> this & "object" !== undefined) === (parseInt_2 && (parseInt_2.a = (-0 | "bar") === "object" >= ([ , 0 ].length === 2)));
                        }
                        var a_2 = f6();
                    }();
                }
                ;
                break;
            }
        } else {
            try {
                switch (--b + +function parseInt() {
                    {
                        var brake94 = 5;
                        do {
                            {
                                var bar_1 = function f7(NaN, b_2) {
                                }();
                            }
                        } while (a++ + (typeof foo_2 == "undefined") && --brake94 > 0);
                    }
                    {
                        var brake96 = 5;
                        L385839: while ((c = c + 1) + (foo_2 && (foo_2.b += ~(false % 5) || (c = c + 1, 
                        "" ^ 38..toString()))) && --brake96 > 0) {
                            try {
                                {
                                    var brake98 = 5;
                                    do {
                                        c = 1 + c, ("foo" ^ -3 || !25) === (c = c + 1, foo_2 = false != 5);
                                    } while ((c = 1 + c, (true > "object", NaN & -4) === -("" | 0)) && --brake98 > 0);
                                }
                            } finally {
                                c = 1 + c, parseInt_2 && (parseInt_2[bar_1 && bar_1.a] *= (parseInt_2 && (parseInt_2[b = a] += (parseInt_2 && (parseInt_2.var = 23..toString() - -4)) & 23..toString() == -4), 
                                25 << 5 != undefined - true));
                                c = 1 + c, ((25 == 2) > (null == 3)) + ((this | 4) === (-5 | true));
                            }
                        }
                    }
                    try {
                        {
                            c = 1 + c, ("function" % ([ , 0 ].length === 2) + (this << this)) % (NaN << "undefined", 
                            undefined >>> 24..toString());
                            c = 1 + c, (25 <= 24..toString() != (undefined === -5)) - (c = c + 1, 22 >= 38..toString());
                            c = 1 + c, (null != 3) / (true > -1) !== ((bar_1 && (bar_1.in %= (38..toString(), 
                            "object"))) !== (-0 || 3));
                            c = 1 + c, ("object" * -2 === (-5 | "")) << false / "undefined" / (([ , 0 ].length === 2) + -0);
                        }
                    } catch (a_2) {
                        L385840: {
                        }
                        {
                            var brake109 = 5;
                            do {
                                c = 1 + c, -4 * 25 >= ([] & "") < (25 >> NaN && "" & NaN);
                            } while ((c = 1 + c, (c = c + 1, ([ , 0 ].length === 2) < 4) || ([ , 0 ].length === 2 || /[a2][^e]+$/) / (-4 && null)) && --brake109 > 0);
                        }
                    }
                }()) {
                  case --b + (a++ ? a++ + (typeof a == "function") : (c = c + 1) + ""):
                    break;

                  case --b + ++a:
                    break;

                  case {
                        Infinity: a++ + (parseInt_2 && parseInt_2[--b + +(("bar" << true >= (parseInt_2 && (parseInt_2[(c = 1 + c, 
                        -1 + 0 != (parseInt_2 && (parseInt_2[(c = 1 + c, foo_2 && (foo_2.NaN += (c = c + 1, 
                        false) >>> 1 + "object" >= (true > -1 < "" / [])))] += true > true)) || NaN > 38..toString() ^ "" == [])] += [ , 0 ][1] | "object"))) >>> ("object" ^ -5) / ("" << -4))] ? (c = c + 1) + a++ : typeof a_1 != "boolean"),
                        undefined: --b + {
                            "-2": /[abc4]/.test(((c = 1 + c, (23..toString() ^ [ , 0 ][1] && /[a2][^e]+$/ != "object") << ((-5 !== [ , 0 ][1]) > (c = c + 1, 
                            23..toString()))) || b || 5).toString()),
                            Infinity: b = a,
                            NaN: delete b
                        }.a,
                        c: (c = c + 1) + parseInt_2
                    }:
                    break;

                  case b++:
                    break;
                }
            } finally {
                try {
                    {
                        var b = function f8(a_2, Math_2) {
                            {
                            }
                            L385841: {
                            }
                        }();
                    }
                } catch (a_2) {
                    --b + ++a;
                    try {
                        {}
                    } finally {
                        {
                            var brake118 = 5;
                            while ((c = 1 + c, (-0 || -5) > (23..toString() | "undefined") != ("object" >= "object" || -1 >> -5)) && --brake118 > 0) {
                                c = 1 + c, ("bar" + -2) * (-1 & -3) != (undefined << [] && [ , 0 ][1] >> ([ , 0 ].length === 2));
                            }
                        }
                        {
                            var expr120 = (c = 1 + c, foo_2 = -0 < "function" > (c = c + 1, "") >= ((2 & -2) !== (25 & 5)));
                            for (var key120 in expr120) {
                                c = 1 + c, (-4 / -5 || (undefined || 23..toString())) / ([ , 0 ][1] % false ^ "foo" === -1);
                            }
                        }
                    }
                } finally {
                }
                {
                    var brake124 = 5;
                    do {
                        {
                            var brake125 = 5;
                            do {
                                var a;
                            } while ((c = c + 1) + {
                                set length(a_2) {
                                    c = 1 + c, parseInt_2 && (parseInt_2.Infinity = ~"function" ^ (4, -2) ^ (24..toString() & [] && {} >>> 0));
                                    this.var = (false || /[a2][^e]+$/) > (1 ^ Infinity);
                                },
                                "\t": a++ + delete a,
                                0: b++,
                                1.5: foo_2 && (foo_2[parseInt_2] += (parseInt_2 = /[a2][^e]+$/ > true) >>> (parseInt_2 && (parseInt_2.b = -4 < Infinity)) >> (-0 << 1) - "function" / 38..toString())
                            } && --brake125 > 0);
                        }
                    } while (--b && --brake124 > 0);
                }
            }
        }
    }
}

console.log(null, a, b, c);

```js
// uglified code
// (beautified)
for (var a = 100, b = 10, c = 0, brake2 = 5; a++ + a && brake2 > 0; --brake2) {
try {
try {
--b, a && (a[(c = 1 + c, (22 >> NaN) / 0 % (null != 24..toString() != (a && (a.Infinity /= !1))))] = -1);
} finally {
var parseInt_2 = --b + (a = function(t) {
for (var n = 5; a++ + [ (c = 1 + c, (1 / 0 <= []) % 25 <= (a.b = (c += 1, 24..toString() || NaN - -5))), (c = 1 + c,
1 >= 4 % (2 === [ , 0 ].length == 2)), (c = 1 + c, 0 <= {} >> -0 != this % "-1"), (c = 1 + c,
((a && (a[(c = 1 + c, -5 != (-1 ^ (a = !0)))] = !0)) & "object" != NaN) <= ({} + 5 || 1 % 24..toString())) ][(c = 1 + c,
a += +this % 0 >= (!1 > (2 === [ , 0 ].length == NaN)))] && n > 0; --n) {
c = 1 + c, a && (a.in = !1);
}
var r = a++ + o;
for (var e in r) {
var o = r[e];
c = 1 + (c = 1 + c);
}
for (var i = 5; --t && --i > 0; ) {
var s = (c = 1 + c, c += 1, 0 / 0 | 0 > ("" <= (2 === [ , 0 ].length)));
for (var _ in s) {
c = 1 + c;
}
}
throw --t + --t;
}(-4)), NaN = (c += 1) + +b;
}
} catch (b) {
parseInt_2 = --b + (b + 1 - .1 - .1 - .1);
for (var b = --b + [ --b + (--b + /[abc4]/.test((a++ + /[abc4]/.test((c = 1 + c,
parseInt_2 && (parseInt_2.NaN += parseInt_2 = "bar" ^ 24..toString() && (c += 1,
-5)) || b || 5).toString()) || b || 5).toString()) || a || 3).toString() ].var, brake20 = 5; --b + (parseInt_2 && parseInt_2[1 / 0]) && --brake20 > 0; ) {
switch ([ a, a++ + +(!1 / ("bar" - 38..toString()) || (c += 1, 0 !== {})), a++, a++ + a, --b + (b + 1 - .1 - .1 - .1) ].null) {
default:
case 2:
break;

          case b--:
            c = 1 + (c += 1), parseInt_2 && (parseInt_2[(c = 1 + c, 1 >> 1 / (25 >>> 38..toString()))] = 0), 
            c = 1 + c, 24..toString(), parseInt_2 = !0, c = 1 + (c = 1 + c), c += 1, parseInt_2 += 1;
            break;

          case b--:
        }
    }
    if (--b + this) {
        switch (new function() {
            try {
                for (var t = 5; (c += 1) + 23..toString() && --t > 0; ) {
                    for (var n = 5; (c += 1) + (c = 1 + c, (0 / 0 != "number" * {}) < (0 != this || 0) ? (c = 1 + c, 
                    (0 / 0 == 5 / []) >>> (0 ^ -3 + 38..toString())) : (c = 1 + c, (!1 == (void 0 === {})) << (parseInt_2 && (parseInt_2[--b + [ (c = 1 + c, 
                    c += 1, 26), (c = 1 + c, 0 / 0 - (-1 == (c += 1, []))), (c = 1 + c, !1 ^ (parseInt_2 && (parseInt_2[a++ + parseInt_2] >>= !1))), (c = 1 + c, 
                    !0), (c = 1 + c, void 0 | -3 % 38..toString() || ("undefined" & 2 === [ , 0 ].length) - (-1 ^ NaN)) ][(c = 1 + c, 
                    c += 1, parseInt_2 && (parseInt_2[(c += 1) + a--] = 0))]] = 254)))) && n > 0; --n) {
                        switch (c = 1 + c, parseInt_2 && (parseInt_2.Infinity = 0 ^ (parseInt_2 && (parseInt_2[(c = 1 + c, 
                        !0)] = 0))), parseInt_2 = 0 / 0) {
                          case c = 1 + c, 0 / 0:
                          case c = 1 + c, !1 !== (parseInt_2 += !1):
                            break;

                          default:
                          case c = 1 + c, -5 !== 38..toString() & this < -4 ^ !1:
                        }
                    }
                }
            } catch (t) {
                var r = void 0;
                c += 1;
            } finally {
                --b, c = 1 + (c = 1 + c), 24..toString(), c = 1 + c, parseInt_2 && (parseInt_2[(c = 1 + c, 
                c += 1, (0 >= this - 2) % (parseInt_2 && (parseInt_2.c = !1)))] += !1), c = 1 + c, 
                parseInt_2 -= -26 == 38..toString() >> 5, c = 1 + c;
                var e = 5;
                do {
                    var o = (c = 1 + c, r && (r[(c = 1 + c, (parseInt_2 && (parseInt_2[(c = 1 + c, -1 < this - !1 && ~(parseInt_2 && (parseInt_2.b = 0)))] ^= 0)) + -1 && (c += 1, 
                    +{}))] = -1), 0 | (parseInt_2 && (parseInt_2.Infinity = "" & 2 === [ , 0 ].length)));
                    for (var i in o) {
                        c = 1 + c, r = !1 ^ {} << !0 | -0 / ((2 === [ , 0 ].length) / !1);
                    }
                } while (++a && --e > 0);
            }
            if (--b + [ (c = 1 + c, 8 != (25 ^ 2 === [ , 0 ].length) && 0 * this ^ 0 || a || 3).toString(), (c += 1) + 24..toString(), --b + {
                1.5: (c = 1 + c, (parseInt_2 && (parseInt_2.b = -2 | {})) * (parseInt_2 && (parseInt_2.foo = 0 / 0)) > (0 ^ -3 == this)),
                var: (c = 1 + c, c += 1, 23..toString() >= (2 === [ , 0 ].length) ^ !0),
                undefined: (c = 1 + c, ~(24..toString() !== []) >> ((2 === [ , 0 ].length === 0) <= "")),
                set Infinity(t) {
                    this.a = -1;
                },
                "-2": (c = 1 + c, (5 >= 23..toString() >= !1) % (0 & 23..toString() | 1))
            }.c, (c = 1 + c, (!1 ^ (c += 1, -2)) - (null >= (parseInt_2 /= !0)) || 4).toString()[(c = 1 + c, 
            parseInt_2 = void 0 >> (c += 1, !1 + "object"))] ][a]) {} else if (new function t() {
                this.a = [] + "bar" == (0 !== 24..toString()), c = 1 + (c = 1 + c), t && (t.Infinity = 0), 
                c = 1 + (c = 1 + c), 24..toString(), 24..toString();
            }()) {
                var s = a++ + (c = 1 + c, -(2 ^ (r && (r.Infinity = -5 == []))) || 6).toString()[(c = 1 + c, 
                !0 | (parseInt_2 && (parseInt_2[{
                    c: (c = 1 + c, (parseInt_2 && (parseInt_2[(c += 1) + --b] += !0 + ("function" & 2 === [ , 0 ].length))) >>> (parseInt_2 = -5 | (r && (r[(c = 1 + c, 
                    0 === (this - "object" || 3))] = 2))))
                }] = !1 === ({} ^ NaN))))];
                for (var _ in s) {
                    var I = s[_];
                    switch (c = 1 + (c = 1 + c), !0 * ([] - 1 / 0 && 1 != 23..toString())) {
                      case c = 1 + c, (-1 === 24..toString()) % 38..toString() - !0:
                      case c = 1 + c, (25 === this) >= (0 != 38..toString()) ^ 22 + (parseInt_2 && (parseInt_2.var += 0)):
                        break;

                      default:
                      case c = 1 + c, (I && (I.c = 0)) - 0:
                    }
                }
            }
            if ((c += 1) + [ a++ + b++, a++ + parseInt_2, (c = 1 + c, -1 !== (/[a2][^e]+$/ !== {}) <= (0 & {}) || a || 3).toString() ]) {
                return /[abc4]/.test((c = 1 + c, (("function" + 24..toString() >= !1) / !0 ? (c = 1 + c, 
                -0 & "object" >= NaN || (parseInt_2 && (parseInt_2[(c = 1 + c, c += 1, 0 ^ (I && (I[(c = 1 + c, 
                c += 1, 0 !== (4 == 38..toString()))] = 0)))] += "undefined")) >>> "bar") : (c = 1 + c, 
                23..toString(), 0 / 0 % (this >= -4 <= 1))) || b || 5).toString());
            }
        }()) {
          case a++ + b--:
            try {
                c += 1;
            } catch (t) {
                if (b |= a) {
                    for (var brake51 = 5; a++ + a-- && brake51 > 0; --brake51) {}
                }
                for (var brake53 = 5; a++ + (b += a) && brake53 > 0; --brake53) {
                    a = {
                        in: (c = 1 + c, +({} >> 0) == !1 >> (parseInt_2 && (parseInt_2[(c = 1 + c, -3 >>> this >> (t -= 0 / 0) <= !(23..toString() - NaN))] = 0 / 0))),
                        "-2": (c = 1 + c, (parseInt_2 = !1) + (-11 ^ 2 / 38..toString())),
                        undefined: (c = 1 + c, !1 << ("function" & (parseInt_2 = 0))),
                        a: void (c = 1 + c)
                    };
                }
            }
            break;

          case parseInt_2 && parseInt_2[b]:
            try {
                c += 1;
            } finally {
                c = 1 + c, parseInt_2 && (parseInt_2[a++ + (parseInt_2 && parseInt_2.foo)] /= this - 22 < 0), 
                parseInt_2 && (parseInt_2[(c = 1 + c, parseInt_2 = !0 & (parseInt_2 += 24..toString() > 1 / 0 == !1))] = 5 << -3);
                for (var brake59 = 5; c = 1 + c, 0 < (38..toString() <= 4 == 1) && brake59 > 0; --brake59) {
                    c = 1 + c, c += 1, c += 1, c += 1;
                }
            }
            switch ([ void (c = 1 + c), (c = 1 + c, (0 / 0 | (parseInt_2 && (parseInt_2[(c = 1 + c, 
            parseInt_2 && (parseInt_2.in = ("undefined" & 23..toString()) % (1 % 24..toString()) < !1))] = -4 ^ {}))) % ~("undefined" | NaN)) ]) {
              case --b + ((c += 1) + {
                    a: (c = 1 + c, parseInt_2 && (parseInt_2[a++] += (parseInt_2 && (parseInt_2[(c = 1 + c, 
                    parseInt_2 && (parseInt_2[a++ + !a] ^= 0 / 0 == 0 <= 1 / 0 / 24..toString()))] = !1)) << 2 & (parseInt_2 = 0 / 0))),
                    "-2": (c = 1 + c, 0 >>> ("number" ^ NaN)),
                    null: (c = 1 + c, .5),
                    b: (c = 1 + c, ((24..toString() && "bar") <= 0) >> ((-3 != {}) << !1))
                }.Infinity || 7).toString()[(c += 1, !0)]:
                c = 1 + c, (NaN - "function" || []) - (0 == this || !0) ? (c = 1 + c, 23..toString(), 
                parseInt_2 = -5, 23..toString()) : c = 1 + c;
                var foo_2 = (c = 1 + c, parseInt_2 /= ([] + 38..toString()) * ({} - NaN) >= (2 === [ , 0 ].length ^ -4) >> 7);
                break;

              case (c += 1) + (foo_2 && foo_2[{
                    NaN: (c = 1 + c, (parseInt_2 && (parseInt_2[a++ + (c = 1 + c, (foo_2 && (foo_2[-2] >>>= 4 & (parseInt_2 && (parseInt_2.c = /[a2][^e]+$/ << this)))) == ((parseInt_2 >>= 2) ^ void 0 << 24..toString()))] += (25 | {}) % !1)) == 0 / 0),
                    0: (c = 1 + c, (NaN << /[a2][^e]+$/ == "object" + NaN) > (4 / 24..toString() < "0number")),
                    c: (c = 1 + c, -1 + [] == "/[a2][^e]+$/foo" & (-2 ^ []) == (c += 1, 1)),
                    0: (c = 1 + c, 38..toString() > 1 !== -3 & !1)
                }.in]):
                parseInt_2 = (c = 1 + c, 1 != (5 | {}) || (!0 & 23..toString()) >>> 25);
                break;

              default:
              case --b + {
                    "\t": (c = 1 + c, 0),
                    c: (c = 1 + c, (parseInt_2 && (parseInt_2.foo = "bar" * (5 | this))) | (2 === [ , 0 ].length) >> -0 == 4294967291),
                    var: (c = 1 + c, (foo_2 && (foo_2[(c += 1) + (b -= a)] -= 0 !== (foo_2 = []))) >>> (c += 1, 
                    0 / 0)),
                    foo: (c = 1 + c, 0 / 0 + ((this >= "object") - ("bar" != {}))),
                    0: (c = 1 + c, 10 >> void (c += 1) << 1)
                }[(c = 1 + c, !0)]:
                c = 1 + (c += 1), (null >= this) + (parseInt_2 = "function" < 38..toString()) > !1 ? (c = 1 + c, 
                24..toString()) : (c = 1 + c, 24..toString(), c += 1, 23..toString());
            }
            var brake71 = 5;
            do {
                a++, c = 1 + c, !1 * 38..toString() % (38..toString() >>> null) != (foo_2 &= 0) ? (c = 1 + c, 
                23..toString(), parseInt_2 && (parseInt_2[!1] = !0 - /[a2][^e]+$/ / this)) : (c = 1 + c, 
                38..toString());
            } while (b && --brake71 > 0);
            for (var brake73 = 5; a++ + (parseInt_2 && (parseInt_2[new function() {
                this[-5] += 0 / 0 ^ (c += 1, "undefined"), this.b += -0 == (parseInt_2 && (parseInt_2.null = void 0 != NaN));
            }()] = parseInt_2 && (parseInt_2.b = (24..toString(), 25)) && -1342177255)) && brake73 > 0; --brake73) {
                try {
                    c = 1 + c, 1 == (0 | (parseInt_2 && (parseInt_2.in ^= "bar"))) ? (c = 1 + c, parseInt_2 ^= {} - "foo") : (c = 1 + c, 
                    foo_2 && (foo_2.in += -0));
                } catch (t) {
                    c = 1 + (c = 1 + c), foo_2 = ("number" & 23..toString()) >>> (4 === 24..toString()) >> !1;
                }
            }
            break;

          case [ 1 | 0 - (23..toString() < 4), (c += 1) + [ parseInt_2 && parseInt_2[!((24..toString() >> (2 === [ , 0 ].length)) + (2 === [ , 0 ].length) <= (!1 & -5 == []))], foo_2, !function() {
                c = 1 + (c = 1 + c), parseInt_2 && (parseInt_2[[ (c = 1 + c, 25 % (!0 >= (void 0 == 24..toString()))), (c = 1 + c, 
                (2 === [ , 0 ].length || "bar") <= 1), (c = 1 + c, (0 !== 24..toString()) >= (c += 1, 
                /[a2][^e]+$/) <= ("function" < 38..toString() <= !1)), (c = 1 + c, c += 1, (5 << -4) * (c += 1, 
                24..toString())), (c = 1 + c, 0 / 0 != (parseInt_2 |= (3 >> (2 === [ , 0 ].length)) / !0)) ].null] += (parseInt_2 && (parseInt_2.var = "bar" + 38..toString())) >>> (-1 << this));
            }(), (c += 1) + parseInt_2, [ (c = 1 + c, -0), (c = 1 + c, c += 1, (2 === [ , 0 ].length) << this <= !1), (c = 1 + c, 
            (0 <= (foo_2 && (foo_2.foo += "object4"))) >> 5 / (parseInt_2 && (parseInt_2.undefined = 0))) ][(c += 1) + a] ].in, (c += 1) + [ (c += 1) + !0, a++ + [ (c = 1 + c, 
            4 >>> 23..toString() == (c += 1, !0) === (c += 1, -5)), (c = 1 + c, 1 == (!1 & 24..toString() - "foo")), (c = 1 + c, 
            +(38..toString() === [] | {} / "object")), (c = 1 + c, 24..toString(), foo_2 && (foo_2[--b + void 0] = !1)), (c = 1 + c, 
            !0 ^ !1 - (this - "bar")) ], 25 + a++ ] ]:
            break;

          case a++ - 2:
            var foo = function(t) {
                var n = function(t, a) {
                    c = 1 + c, parseInt_2 && (parseInt_2.a = (parseInt_2 && (parseInt_2[(c = 1 + c, 
                    !1 * ({} / -3) === (parseInt_2 && (parseInt_2[b = t] ^= 0 != "object" >> {})))] = -2 > (2 === [ , 0 ].length))) - (c += 1, 
                    25)), c = 1 + c, parseInt_2 && (parseInt_2.c = -64), c += 1, foo_2 && (foo_2.b = !1), 
                    foo_2 && (foo_2.undefined = 0 / 0);
                }();
                c = 1 + (c = 1 + c), foo_2 && (foo_2[a++ + (n && n.null)] += 2 < NaN ^ -2 << {}), 
                c = 1 + c, c = 1 + c, 24..toString(), c = 1 + c, c = 1 + c, 38..toString(), c = 1 + c, 
                parseInt_2 && (parseInt_2.a = 0 === "object" >= (2 === [ , 0 ].length));
            }();
        }
    } else {
        try {
            switch (--b + +function() {
                var t = 5;
                do {
                    var n = void 0;
                } while (a++ + (void 0 === foo_2) && --t > 0);
                for (var r = 5; (c += 1) + (foo_2 && (foo_2.b += -1)) && --r > 0; ) {
                    try {
                        var e = 5;
                        do {
                            c = 1 + c, c += 1, foo_2 = !0;
                        } while (c = 1 + c, -0 == (-4 & NaN) && --e > 0);
                    } finally {
                        c = 1 + c, parseInt_2 && (parseInt_2[n && n.a] *= (parseInt_2 && (parseInt_2[b = a] += (parseInt_2 && (parseInt_2.var = 23..toString() - -4)) & -4 == 23..toString()), 
                        !0)), c = 1 + c;
                    }
                }
                try {
                    c = 1 + c, 24..toString(), c = 1 + c, 24..toString(), c += 1, 38..toString(), c = 1 + c, 
                    n && (n.in %= (38..toString(), "object")), c = 1 + c;
                } catch (t) {
                    var o = 5;
                    do {
                        c = 1 + c;
                    } while (c = 1 + c, c += 1, ((2 === [ , 0 ].length) < 4 || (2 === [ , 0 ].length || /[a2][^e]+$/) / null) && --o > 0);
                }
            }()) {
              case --b + (a++ ? a++ + ("function" == typeof a) : (c += 1) + ""):
              case --b + ++a:
              case {
                    Infinity: a++ + (parseInt_2 && parseInt_2[--b + +((0 >= (parseInt_2 && (parseInt_2[(c = 1 + c, 
                    -1 != (parseInt_2 && (parseInt_2[(c = 1 + c, foo_2 && (foo_2.NaN += (c += 1, 0 >= (!0 < "" / []))))] += !1)) || NaN > 38..toString() ^ "" == [])] += 0))) >>> -1 / 0)] ? (c += 1) + a++ : "boolean" != typeof a_1),
                    undefined: --b + {
                        "-2": /[abc4]/.test((c = 1 + c, (0 ^ 23..toString() && !0) << (!0 > (c += 1, 23..toString())) || b || 5).toString()),
                        Infinity: b = a,
                        NaN: delete b
                    }.a,
                    c: (c += 1) + parseInt_2
                }:
              case b++:
            }
        } finally {
            try {
                var b = void 0;
            } catch (t) {
                --b, ++a;
                for (var brake118 = 5; c = 1 + c, -5 > ("undefined" | 23..toString()) != !0 && --brake118 > 0; ) {
                    c = 1 + c;
                }
                var expr120 = (c = 1 + c, foo_2 = !1 > (c += 1, "") >= !0);
                for (var key120 in expr120) {
                    c = 1 + c;
                }
            }
            var brake124 = 5;
            do {
                var brake125 = 5;
                do {} while ((c += 1) + {
                    set length(t) {
                        c = 1 + c, parseInt_2 && (parseInt_2.Infinity = 1 ^ (24..toString() & [] && {} >>> 0)), 
                        this.var = !1;
                    },
                    "\t": a++ + delete a,
                    0: b++,
                    1.5: foo_2 && (foo_2[parseInt_2] += (parseInt_2 = !1) >>> (parseInt_2 && (parseInt_2.b = !0)) >> 0 - "function" / 38..toString())
                } && --brake125 > 0);
            } while (--b && --brake124 > 0);
        }
    }
}

}

console.log(null, a, b, c);

```js
original result:
null 16 5 1425

uglified result:
null 16 0 1425

minify(options):
{}

Suspicious compress options:
  collapse_vars
  conditionals
  evaluate
bug

All 7 comments

This one could be an uglify bug.

$ bin/uglifyjs -V
uglify-js 3.2.2

$ cat t2571.js | node
null 16 5 1425

$ cat t2571.js | bin/uglifyjs -c | node
null 16 5 1425

$ cat t2571.js | bin/uglifyjs -m | node
null 16 5 1425

$ cat t2571.js | bin/uglifyjs -mc | node
null 16 0 1425

Reduced test case:

var a = 100, b = 10;

try {
    var a = function f0(b) {
        throw --b + --b;
    }(-4);
    var parseInt_2 = --b + a;
} catch (e) {
}

console.log(b);
$ cat test.js | node
10
$ uglifyjs test.js -mc | node
9
$ uglifyjs test.js -mc --no-rename | node
10

That's a first. I guess the fuzzer does not presently handle isolating --no-rename failures.

Actually, I think I see where this has gone wrong - and it doesn't have anything to do with rename :sweat:

The b from function f0(b) is preventing collapse_vars from moving a - this fails regardless of rename:

var a = 100, b = 10;

try {
    var a = function f0(c) {
        throw --c + --c;
    }(-4);
    var parseInt_2 = --b + a;
} catch (e) {
}

console.log(b);
$ cat test.js | node
10
$ uglifyjs test.js -mc | node
9
$ uglifyjs test.js -mc --no-rename | node
9

Hey, look on the bright side - the fuzzer is still kicking ass and taking names. :-)

Such bugs would be impossible to find without it.

Another test case:

$ echo 'try{var a=A,b=1;throw a}catch(e){console.log(b)}' | node
undefined
$ echo 'try{var a=A,b=1;throw a}catch(e){console.log(b)}' | uglifyjs -c toplevel | node
1

I gotta remember to not write such code!
:-P

Was this page helpful?
0 / 5 - 0 ratings

Related issues

buu700 picture buu700  路  5Comments

hacdias picture hacdias  路  5Comments

uiteoi picture uiteoi  路  5Comments

alexlamsl picture alexlamsl  路  4Comments

chrismanley picture chrismanley  路  5Comments