Fuzzer: Refactor check_whole_compiler so it doesn't halt the fuzzer when it finds a bug.
This commit is contained in:
parent
8e1902f30f
commit
5ef27245b1
1 changed files with 50 additions and 12 deletions
|
@ -166,41 +166,79 @@ fn check_variants_of_ast(crate: &ast::crate, codemap: &codemap::codemap,
|
||||||
io::string_reader(""), _,
|
io::string_reader(""), _,
|
||||||
pprust::no_ann()));
|
pprust::no_ann()));
|
||||||
check_roundtrip_convergence(str3, 1u);
|
check_roundtrip_convergence(str3, 1u);
|
||||||
//check_whole_compiler(str3);
|
//let label = #fmt("buggy_%s_%ud_%ud.rs", last_part(filename), i, j);
|
||||||
|
//check_whole_compiler(str3, label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn last_part(filename: &str) -> str {
|
||||||
|
let ix = str::rindex(filename, 47u8 /* '/' */);
|
||||||
|
assert ix >= 0;
|
||||||
|
str::slice(filename, ix as uint + 1u, str::byte_len(filename) - 3u)
|
||||||
|
}
|
||||||
|
|
||||||
|
tag compile_result { known_bug(str); passed(str); failed(str); }
|
||||||
|
|
||||||
// We'd find more bugs if we could take an AST here, but
|
// We'd find more bugs if we could take an AST here, but
|
||||||
// - that would find many "false positives" or unimportant bugs
|
// - that would find many "false positives" or unimportant bugs
|
||||||
// - that would be tricky, requiring use of tasks or serialization or randomness.
|
// - that would be tricky, requiring use of tasks or serialization or randomness.
|
||||||
// This seems to find plenty of bugs as it is :)
|
// This seems to find plenty of bugs as it is :)
|
||||||
fn check_whole_compiler(code: &str) {
|
fn check_whole_compiler(code: &str, suggested_filename: &str) {
|
||||||
let filename = "test.rs";
|
let filename = "test.rs";
|
||||||
write_file(filename, code);
|
write_file(filename, code);
|
||||||
let p =
|
alt check_whole_compiler_inner(filename) {
|
||||||
std::run::program_output(
|
known_bug(s) {
|
||||||
|
log_err "Ignoring known bug: " + s;
|
||||||
|
}
|
||||||
|
failed(s) {
|
||||||
|
log_err "check_whole_compiler failure: " + s;
|
||||||
|
write_file(suggested_filename, code);
|
||||||
|
log_err "Saved as: " + suggested_filename;
|
||||||
|
}
|
||||||
|
passed(_) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_whole_compiler_inner(filename: &str) -> compile_result {
|
||||||
|
let p = std::run::program_output(
|
||||||
"/Users/jruderman/code/rust/build/stage1/rustc",
|
"/Users/jruderman/code/rust/build/stage1/rustc",
|
||||||
["-c", filename]);
|
["-c", filename]);
|
||||||
|
|
||||||
//log_err #fmt("Status: %d", p.status);
|
//log_err #fmt("Status: %d", p.status);
|
||||||
//log_err "Output: " + p.out;
|
|
||||||
if p.err != "" {
|
if p.err != "" {
|
||||||
if false {
|
if contains(p.err, "May only branch on boolean predicates") {
|
||||||
|
known_bug("https://github.com/graydon/rust/issues/892")
|
||||||
|
} else if contains(p.err, "(S->getType()->isPointerTy() && \"Invalid cast\")") {
|
||||||
|
known_bug("https://github.com/graydon/rust/issues/895")
|
||||||
} else {
|
} else {
|
||||||
log_err "Stderr: " + p.err;
|
log_err "Stderr: " + p.err;
|
||||||
fail "Unfamiliar error message";
|
failed("Unfamiliar error message")
|
||||||
}
|
}
|
||||||
} else if p.status == 256 {
|
} else if p.status == 6 {
|
||||||
if !contains(p.out, "error:") {
|
if contains(p.out, "get_id_ident: can't find item in ext_map") {
|
||||||
fail "Exited with status 256 without a span-error";
|
known_bug("https://github.com/graydon/rust/issues/876")
|
||||||
|
} else if contains(p.out, "Assertion !cx.terminated failed") {
|
||||||
|
known_bug("https://github.com/graydon/rust/issues/893 or https://github.com/graydon/rust/issues/894")
|
||||||
|
} else if !contains(p.out, "error:") {
|
||||||
|
log_err "Stdout: " + p.out;
|
||||||
|
failed("Rejected the input program without a span-error explanation")
|
||||||
|
} else {
|
||||||
|
passed("Rejected the input program cleanly")
|
||||||
}
|
}
|
||||||
} else if p.status == 11 {
|
} else if p.status == 11 {
|
||||||
log_err "What is this I don't even";
|
failed("Crashed!?")
|
||||||
} else if p.status != 0 { fail "Unfamiliar status code"; }
|
} else if p.status == 0 {
|
||||||
|
passed("Accepted the input program")
|
||||||
|
} else {
|
||||||
|
log_err p.status;
|
||||||
|
log_err p.out;
|
||||||
|
failed("Unfamiliar status code")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn parse_and_print(code: &str) -> str {
|
fn parse_and_print(code: &str) -> str {
|
||||||
let filename = "tmp.rs";
|
let filename = "tmp.rs";
|
||||||
let sess = @{cm: codemap::new_codemap(), mutable next_id: 0};
|
let sess = @{cm: codemap::new_codemap(), mutable next_id: 0};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue