fix infinite recursion in ufuzz (#4318)

This commit is contained in:
Alex Lam S.L
2020-11-25 01:33:42 +00:00
committed by GitHub
parent 1e8fa1aa1d
commit 9b3a363604

View File

@@ -314,6 +314,7 @@ var TYPEOF_OUTCOMES = [
"crap", "crap",
]; ];
var avoid_vars = [];
var block_vars = []; var block_vars = [];
var unique_vars = []; var unique_vars = [];
var loops = 0; var loops = 0;
@@ -393,16 +394,12 @@ function createAssignmentPairs(recurmax, noComma, stmtDepth, canThrow, varNames,
} }
function createKey(recurmax, keys) { function createKey(recurmax, keys) {
var save = VAR_NAMES; addAvoidVars(avoid);
VAR_NAMES = VAR_NAMES.filter(function(name) {
return avoid.indexOf(name) < 0;
});
var len = VAR_NAMES.length;
var key; var key;
do { do {
key = createObjectKey(recurmax, stmtDepth, canThrow); key = createObjectKey(recurmax, stmtDepth, canThrow);
} while (keys.indexOf(key) >= 0); } while (keys.indexOf(key) >= 0);
VAR_NAMES = save.concat(VAR_NAMES.slice(len)); removeAvoidVars(avoid);
return key; return key;
} }
@@ -511,6 +508,8 @@ function createBlockVariables(recurmax, stmtDepth, canThrow, fn) {
} }
unique_vars.length -= 6; unique_vars.length -= 6;
fn(function() { fn(function() {
addAvoidVars(consts);
addAvoidVars(lets);
if (rng(2)) { if (rng(2)) {
return createDefinitions("const", consts) + "\n" + createDefinitions("let", lets) + "\n"; return createDefinitions("const", consts) + "\n" + createDefinitions("let", lets) + "\n";
} else { } else {
@@ -522,11 +521,6 @@ function createBlockVariables(recurmax, stmtDepth, canThrow, fn) {
function createDefinitions(type, names) { function createDefinitions(type, names) {
if (!names.length) return ""; if (!names.length) return "";
var save = VAR_NAMES;
VAR_NAMES = VAR_NAMES.filter(function(name) {
return names.indexOf(name) < 0;
});
var len = VAR_NAMES.length;
var s = type + " "; var s = type + " ";
switch (rng(10)) { switch (rng(10)) {
case 0: case 0:
@@ -547,18 +541,18 @@ function createBlockVariables(recurmax, stmtDepth, canThrow, fn) {
}).join(", ") + "};"; }).join(", ") + "};";
break; break;
default: default:
s += names.map(function(name, i) { s += names.map(function(name) {
if (type == "let" && !rng(10)) { if (type == "let" && !rng(10)) {
VAR_NAMES.push(name); removeAvoidVars([ name ]);
return name; return name;
} }
var value = createExpression(recurmax, NO_COMMA, stmtDepth, canThrow); var value = createExpression(recurmax, NO_COMMA, stmtDepth, canThrow);
VAR_NAMES.push(name); removeAvoidVars([ name ]);
return name + " = " + value; return name + " = " + value;
}).join(", ") + ";"; }).join(", ") + ";";
break; break;
} }
VAR_NAMES = save.concat(VAR_NAMES.slice(len)); removeAvoidVars(names);
return s; return s;
} }
} }
@@ -1300,10 +1294,25 @@ function createUnaryPostfix() {
return UNARY_POSTFIX[rng(UNARY_POSTFIX.length)]; return UNARY_POSTFIX[rng(UNARY_POSTFIX.length)];
} }
function addAvoidVars(names) {
avoid_vars = avoid_vars.concat(names);
}
function removeAvoidVars(names) {
names.forEach(function(name) {
var index = avoid_vars.lastIndexOf(name);
if (index >= 0) avoid_vars.splice(index, 1);
});
}
function getVarName(noConst) { function getVarName(noConst) {
// try to get a generated name reachable from current scope. default to just `a` // try to get a generated name reachable from current scope. default to just `a`
var name = VAR_NAMES[INITIAL_NAMES_LEN + rng(VAR_NAMES.length - INITIAL_NAMES_LEN)]; var name, tries = 10;
return !name || noConst && block_vars.indexOf(name) >= 0 ? "a" : name; do {
if (--tries < 0) return "a";
name = VAR_NAMES[INITIAL_NAMES_LEN + rng(VAR_NAMES.length - INITIAL_NAMES_LEN)];
} while (!name || avoid_vars.indexOf(name) >= 0 || noConst && block_vars.indexOf(name) >= 0);
return name;
} }
function createVarName(maybe, dontStore) { function createVarName(maybe, dontStore) {