From 2c9c72e06c674ae313001d0b5878fe2ccfc31492 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Sat, 19 Dec 2020 18:31:09 +0000 Subject: [PATCH] suppress false positives in `ufuzz` (#4419) --- README.md | 10 ++++++++++ test/ufuzz/index.js | 13 +++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4753b4c2..c23116bd 100644 --- a/README.md +++ b/README.md @@ -1217,3 +1217,13 @@ To allow for better optimizations, the compiler makes various assumptions: // SyntaxError: Identifier 'a' has already been declared ``` UglifyJS may modify the input which in turn may suppress those errors. +- Later versions of JavaScript will throw `SyntaxError` with the following: + ```js + try { + // ... + } catch ({ message: a }) { + var a; + } + // SyntaxError: Identifier 'a' has already been declared + ``` + UglifyJS may modify the input which in turn may suppress those errors. diff --git a/test/ufuzz/index.js b/test/ufuzz/index.js index 848b22bc..77a69a51 100644 --- a/test/ufuzz/index.js +++ b/test/ufuzz/index.js @@ -862,16 +862,15 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn var block_len = block_vars.length; var nameLenBefore = VAR_NAMES.length; var unique_len = unique_vars.length; - var offset = SUPPORT.catch_omit_var ? 0 : SUPPORT.destructuring ? 1 : 2; - switch (offset + rng(20 - offset)) { - case 0: + if (SUPPORT.catch_omit_var && !rng(20)) { s += " catch { "; - break; - case 1: + } else if (canThrow && SUPPORT.destructuring && !rng(20)) { + unique_vars.push("a", "b", "c", "undefined", "NaN", "Infinity"); var name = createVarName(MANDATORY); block_vars.push(name); var message = createVarName(MANDATORY); block_vars.push(message); + unique_vars.length -= 6; if (SUPPORT.computed_key && rng(10) == 0) { s += " catch ({ message: " + message + ", "; addAvoidVars([ name ]); @@ -881,12 +880,10 @@ function createStatement(recurmax, canThrow, canBreak, canContinue, cannotReturn } else { s += " catch ({ name: " + name + ", message: " + message + " }) { "; } - break; - default: + } else { var name = createVarName(MANDATORY); if (!catch_redef) unique_vars.push(name); s += " catch (" + name + ") { "; - break; } var catches = VAR_NAMES.length - nameLenBefore; s += defns() + "\n";