mishoo/UglifyJS

ufuzz failure

alexlamsl opened this issue · 0 comments

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

function f0(NaN_1, arguments_2, a_1) {
    try {
        {
            var foo_1 = function f1(bar, b_2) {}([ , 0 ].length === 2, /[a2][^e]+$/, (c = c + 1) + (1 === 1 ? a : b));
        }
    } catch (a_1) {
        {
            var yield_2 = function f2(bar_1, ...bar) {
                switch (a++ + (1 === 1 ? a : b)) {
                  case a++ + (b = a):
                    c = c + 1;
                    break;

                  case /[abc4]/.test((a++ + (b = a) || b || 5).toString()):
                    break;

                  case {
                        "": --b + /[abc4]/.test(((c = 1 + c, (arguments_2 = (Number(0xdeadn << 16n | 0xbeefn) <= -0) / ("" ?? [ , 0 ].length === 2)) ^ (bar = "function" >= -3) != "number" - 23..toString()) || b || 5).toString()),
                        c: b = a
                    }:
                    {
                        var c_1 = function f3(undefined_1) {
                        }();
                    }
                    break;

                  case --b + delete (-3 >>> NaN >>> (22 && "b") | (c_1 += 22 == "b") >>> {} % -5):
                    {
                        var brake7 = 5;
                        while (--b + (typeof f4 == "function" && --_calls_ >= 0 && f4((c = 1 + c, 
                        ("function" >>> "" ^ ("function" ^ "a")) > (c_1 /= "a" ^ 0) - (this >> NaN)))) && --brake7 > 0) {
                            c = c + 1;
                        }
                    }
                }
            }(a_1, 24..toString() in {
                Infinity: a++ + /[abc4]/g.exec((!b || b || 5).toString())
            } ? (c = c + 1) + {
                "": (c = c + 1) + [ (c = 1 + c, ("b" ^ 4) != -4 * /[a2][^e]+$/ === (-5 << 24..toString() || "foo" / "function")) ][a++ + 25],
                a: a++ + (arguments_2 *= false in [])
            }[a++ + (1 === 1 ? a : b)] : a_1);
        }
    }
    {
        var brake10 = 5;
        while ((b = a) && --brake10 > 0) {
            var a_2 = function f4(foo_1) {
                try {
                    if ([ ((c = 1 + c, (+ -0 & -3 <= 24..toString()) < (-3 % 38..toString() ^ "number" * 3)) || 7).toString()[c = 1 + c, 
                    (foo_1 && (foo_1.then *= 38..toString() >> "number" <= -2 >> 24..toString())) < (a_1 = "c" >= 5 | 3 ^ 5)] ].var) {
                        c = c + 1;
                    } else {
                        c = c + 1;
                    }
                } catch (b_2) {} finally {
                    (c = c + 1) + (1 === 1 ? a : b);
                }
                if ((c = c + 1) + foo_1) {
                    var a_1 = function f5(a_2, foo, await_1) {
                        c = 1 + c, (-4 + 0 && (c = c + 1, 25)) >> (("function", 
                        25) & (2 && 22));
                        {
                            var brake21 = 5;
                            do {
                                c = 1 + c, a_2 && (a_2[void function foo() {
                                    c = 1 + c, (22, 23..toString()) != 0 * 25 && "foo" << 0 >= (arguments_2 && (arguments_2[c = 1 + c, 
                                    (-3 && 1) % (5 <= 1) >>> (3 >= this) ** (1 % "c")] -= (Infinity, 
                                    "undefined")));
                                    c = 1 + c, (("" && -5) <= 5 << true) >> (/[a2][^e]+$/ + 38..toString() & "a" >>> 5);
                                    c = 1 + c, (-5 === 2) + (-3 == -5) >= ([ , 0 ][1] * /[a2][^e]+$/ < (null <= 22));
                                }()] ??= (-0 >>> false & "b" % "undefined") < ("undefined" >= 23..toString(), 
                                null ^ /[a2][^e]+$/));
                            } while ((c = 1 + c, (foo_1 && ({
                                foo: foo_1.get
                            } = {
                                foo: "function" & false
                            })) | "" !== 1 | (-2 >> 0) - (foo_1 && (foo_1.null = false >> "undefined"))) && --brake21 > 0);
                        }
                    }(function c_1() {});
                }
            }((c = c + 1) + (typeof f4 == "function" && --_calls_ >= 0 && f4(--b + NaN_1, 2)));
        }
    }
}

var a_2 = f0("foo");

console.log(null, a, b, c, Infinity, NaN, undefined);
// uglified code
// (beautified)
var _calls_ = 10, a = 100, b = 10, c = 0;

function f0(n, t, o) {
    try {
        c += 1;
    } catch (o) {
        !function() {
            switch (a++ + a) {
              case a++ + (b = a):
                c += 1;
                break;

              case /[abc4]/.test((a++ + (b = a) || b || 5).toString()):
                break;

              case {
                    "": --b + /[abc4]/.test((c = 1 + c, (!0 ^ (t = (+("" + (0xdeadn << 16n | 0xbeefn)) <= -0) / "") || b || 5).toString())),
                    c: b = a
                }:
                var n = void 0;
                break;

              case --b + (n += !1, !0):
                for (var o = 5; --b + ("function" == typeof f4 && 0 <= --_calls_ && f4((c = 1 + c, 
                (n /= 0) - (this >> NaN) < 0))) && 0 < --o; ) {
                    c += 1;
                }
            }
        }("24" in {
            Infinity: a++ + /[abc4]/g.exec((!b || b || 5).toString())
        } && (c = 1 + (c = c + 1 + 1), a++, a++, t *= !1 in [], a++));
    }
    for (var f = 5; (b = a) && 0 < --f; ) {
        var i = void 0, e = (c += 1) + ("function" == typeof f4 && 0 <= --_calls_ && f4(--b + n, 2));
        try {
            c = 1 + (c = 1 + c), e && (e.then *= !1), c += 1;
        } catch (c) {} finally {
            c += 1;
        }
        if ((c += 1) + e) {
            c = 1 + c, c += 1;
            for (var i = 5; c = 1 + c, (void 0)[void function() {
                c = 1 + c, t && (t[c = 1 + c, NaN >>> (this <= 3) ** NaN] -= "undefined"), 
                c = 1 + (c = 1 + c);
            }()] ??= !1, c = 1 + c, !0 | (e && ({
                foo: e.get
            } = {
                foo: 0
            })) | -2 - (e && (e.null = 0)) && 0 < --i; ) {}
        }
    }
}

var a_2 = f0("foo");

console.log(null, a, b, c, 1 / 0, NaN, void 0);
original result:
null 100 100 133 Infinity NaN undefined

uglified result:
evalmachine.<anonymous>:1
var _calls_=10,a=100,b=10,c=0;function f0(n,t,o){try{c+=1}catch(o){!function(){switch(a+++a){case a+++(b=a):c+=1;break;case/[abc4]/.test((a+++(b=a)||b||5).toString()):break;case{"":--b+/[abc4]/.test((c=1+c,(!0^(t=(+(""+(0xdeadn<<16n|0xbeefn))<=-0)/"")||b||5).toString())),c:b=a}:var n=void 0;break;case--b+(n+=!1,!0):for(var o=5;--b+("function"==typeof f4&&0<=--_calls_&&f4((c=1+c,(n/=0)-(this>>NaN)<0)))&&0<--o;)c+=1}}("24"in{Infinity:a+++/[abc4]/g.exec((!b||b||5).toString())}&&(c=1+(c=c+1+1),a++,a++,t*=!1 in[],a++))}for(var f=5;(b=a)&&0<--f;){var i=void 0,e=(c+=1)+("function"==typeof f4&&0<=--_calls_&&f4(--b+n,2));try{c=1+(c=1+c),e&&(e.then*=!1),c+=1}catch(c){}finally{c+=1}if((c+=1)+e){c=1+c,c+=1;for(var i=5;c=1+c,(void 0)[void function(){c=1+c,t&&(t[c=1+c,NaN>>>(this<=3)**NaN]-="undefined"),c=1+(c=1+c)}()]??=!1,c=1+c,!0|(e&&({foo:e.get}={foo:0}))|-2-(e&&(e.null=0))&&0<--i;);}}}var a_2=f0("foo");console.log(null,a,b,c,1/0,NaN,void 0);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ^

TypeError: Cannot read properties of undefined (reading 'undefined')
    at f0 (evalmachine.<anonymous>:1:814)
    at evalmachine.<anonymous>:1:898
    at Script.runInContext (node:vm:141:12)
    at Object.runInContext (node:vm:297:6)
    at run_code_vm (/Users/runner/work/UglifyJS/UglifyJS/test/sandbox.js:273:12)
    at Object.exports.run_code (/Users/runner/work/UglifyJS/UglifyJS/test/sandbox.js:36:38)
    at run_code (/Users/runner/work/UglifyJS/UglifyJS/test/ufuzz/index.js:2116:20)
    at /Users/runner/work/UglifyJS/UglifyJS/test/ufuzz/index.js:2572:29
    at Array.forEach (<anonymous>)
    at Object.<anonymous> (/Users/runner/work/UglifyJS/UglifyJS/test/ufuzz/index.js:2559:20)
// reduced test case (output will differ)

// (beautified)
var c = 0;

function f0() {
    while (1) {
        var a_2 = function f4(foo_1) {
            try {
                0();
            } catch (b_2) {}
            if (foo_1) {
                var a_1 = function f5(a_2) {
                    do {
                        console.log(a_2[0]);
                    } while (1);
                }(function c_1() {});
            }
        }(c + 1);
    }
}

f0();
// output: Error: Script execution timed out after 100ms
// minify: TypeError: Cannot read properties of undefined (reading '0')
// options: {
//   "compress": {
//     "passes": 1000000,
//     "sequences": 1000000,
//     "unsafe": true,
//     "unsafe_Function": true,
//     "unsafe_math": true,
//     "unsafe_proto": true,
//     "unsafe_regexp": true
//   },
//   "module": false,
//   "output": {
//     "v8": true
//   },
//   "validate": true
// }
minify(options):
{
  "compress": {
    "passes": 1000000,
    "sequences": 1000000,
    "unsafe": true,
    "unsafe_Function": true,
    "unsafe_math": true,
    "unsafe_proto": true,
    "unsafe_regexp": true
  },
  "module": false,
  "output": {
    "v8": true
  }
}

Suspicious compress options:
  evaluate
  functions
  if_return
  inline
  passes
  reduce_vars
  side_effects
  unused