reduce false positives from fuzzing (#3417)
This commit is contained in:
@@ -66,3 +66,17 @@ toplevel_Infinity_NaN_undefined: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "foo 42 null"
|
expect_stdout: "foo 42 null"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_global: {
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
return this;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
return this;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "[object global]"
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,29 +1,7 @@
|
|||||||
var semver = require("semver");
|
var semver = require("semver");
|
||||||
var vm = require("vm");
|
var vm = require("vm");
|
||||||
|
|
||||||
function safe_log(arg, level) {
|
var setupContext = new vm.Script([
|
||||||
if (arg) switch (typeof arg) {
|
|
||||||
case "function":
|
|
||||||
return arg.toString();
|
|
||||||
case "object":
|
|
||||||
if (/Error$/.test(arg.name)) return arg.toString();
|
|
||||||
arg.constructor.toString();
|
|
||||||
if (level--) for (var key in arg) {
|
|
||||||
var desc = Object.getOwnPropertyDescriptor(arg, key);
|
|
||||||
if (!desc || !desc.get) arg[key] = safe_log(arg[key], level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return arg;
|
|
||||||
}
|
|
||||||
|
|
||||||
function log(msg) {
|
|
||||||
if (arguments.length == 1 && typeof msg == "string") return console.log("%s", msg);
|
|
||||||
return console.log.apply(console, [].map.call(arguments, function(arg) {
|
|
||||||
return safe_log(arg, 3);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
var func_toString = new vm.Script([
|
|
||||||
"[ Array, Boolean, Error, Function, Number, Object, RegExp, String ].forEach(function(f) {",
|
"[ Array, Boolean, Error, Function, Number, Object, RegExp, String ].forEach(function(f) {",
|
||||||
" f.toString = Function.prototype.toString;",
|
" f.toString = Function.prototype.toString;",
|
||||||
"});",
|
"});",
|
||||||
@@ -44,12 +22,36 @@ var func_toString = new vm.Script([
|
|||||||
' return "function(){}";',
|
' return "function(){}";',
|
||||||
" };",
|
" };",
|
||||||
"}();",
|
"}();",
|
||||||
|
"this;",
|
||||||
]).join("\n"));
|
]).join("\n"));
|
||||||
|
|
||||||
function createContext() {
|
function createContext() {
|
||||||
var ctx = vm.createContext(Object.defineProperty({}, "console", { value: { log: log } }));
|
var ctx = vm.createContext(Object.defineProperty({}, "console", { value: { log: log } }));
|
||||||
func_toString.runInContext(ctx);
|
var global = setupContext.runInContext(ctx);
|
||||||
return ctx;
|
return ctx;
|
||||||
|
|
||||||
|
function safe_log(arg, level) {
|
||||||
|
if (arg) switch (typeof arg) {
|
||||||
|
case "function":
|
||||||
|
return arg.toString();
|
||||||
|
case "object":
|
||||||
|
if (arg === global) return "[object global]";
|
||||||
|
if (/Error$/.test(arg.name)) return arg.toString();
|
||||||
|
arg.constructor.toString();
|
||||||
|
if (level--) for (var key in arg) {
|
||||||
|
var desc = Object.getOwnPropertyDescriptor(arg, key);
|
||||||
|
if (!desc || !desc.get) arg[key] = safe_log(arg[key], level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
function log(msg) {
|
||||||
|
if (arguments.length == 1 && typeof msg == "string") return console.log("%s", msg);
|
||||||
|
return console.log.apply(console, [].map.call(arguments, function(arg) {
|
||||||
|
return safe_log(arg, 3);
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.run_code = function(code, toplevel) {
|
exports.run_code = function(code, toplevel) {
|
||||||
|
|||||||
Reference in New Issue
Block a user