diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-09-25 16:04:17 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-25 16:04:17 -0500 |
commit | c7970102cc44df3a7862c1d16ee2e23f4902835f (patch) | |
tree | 416738ca828aab2888caa00d42622ca8358a18a5 | |
parent | 9113b7b51b189a4a8e4c2d59d8403e3f947239fe (diff) | |
parent | ba2db57c78df73cea85d227001d4b505b3a1fb9a (diff) |
Auto merge of #1035 - fitzgen:csmith-tweaks, r=pepyakin
Csmith tweaks
r? @e00E or @emilio or @pepyakin whoever wants to get here first ;)
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | csmith-fuzzing/driver.py | 107 |
2 files changed, 87 insertions, 23 deletions
@@ -11,3 +11,6 @@ ir.png # Output of the --dump-preprocessed-input flag. __bindgen.* + +# Generated by C-Smith +csmith-fuzzing/platform.info diff --git a/csmith-fuzzing/driver.py b/csmith-fuzzing/driver.py index ee42203d..e2816813 100644 --- a/csmith-fuzzing/driver.py +++ b/csmith-fuzzing/driver.py @@ -1,33 +1,94 @@ -from subprocess import run, DEVNULL, PIPE +import os, sys +from subprocess import run, SubprocessError, DEVNULL, PIPE +from tempfile import NamedTemporaryFile csmith_command = [ - "csmith", - "--no-checksum", - "--nomain", - "--max-block-size", "1", - "--max-block-depth", "1", - "--output", "generated.h"] + "csmith", + "--no-checksum", + "--nomain", + "--max-block-size", "1", + "--max-block-depth", "1", +] -bindgen_command = ["bindgen", "generated.h"] +def cat(path, title=None): + if not title: + title = path + print("-------------------- {} --------------------".format(title)) + run(["cat", path]) -if __name__ == "__main__": - print("Bindgen fuzzing with csmith.") - print( - "This script will write to generated.h, bindgen_stdout, bindgen_stderr and platform.info . " - "These files can be deleted after running.") +def run_logged(cmd): + with NamedTemporaryFile() as stdout, NamedTemporaryFile() as stderr: + result = run(cmd, stdin=DEVNULL, stdout=stdout, stderr=stderr) + if result.returncode != 0: + print() + print("Error: '{}' exited with code {}".format(" ".join(cmd), result.returncode)) + cat(stdout.name, title="stdout") + cat(stdout.name, title="stderr") + return result + +def run_bindgen(input, output): + return run_logged([ + "bindgen", + "--with-derive-partialeq", + "--with-derive-eq", + "-o", output.name, + input.name, + "--", + "-I", os.path.abspath(os.path.dirname(sys.argv[0])), + ]) + +def run_rustc(output, test): + return run_logged([ + "rustc", + "--crate-type", "lib", + "--test", + output.name, + "-o", test.name, + ]) + +def main(): + print("Fuzzing `bindgen` with C-Smith...\n") iterations = 0 while True: print("\rIteration: {}".format(iterations), end="", flush=True) - run(csmith_command, stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL) - with open("bindgen_stdout", "wb") as stdout, open("bindgen_stdout", "wb") as stderr: - result = run(bindgen_command, stdin=DEVNULL, stdout=stdout, stderr=stderr) - if result.returncode != 0: - print() - print( - "Error: bindgen existed with non zero exit code {} when ran on generated.h . " - "You can find its output in bindgen_stoud and bindgen_stderr." - .format(result.returncode)) - exit() + input = NamedTemporaryFile(delete=False, prefix="input-", suffix=".h") + input.close() + result = run_logged(csmith_command + ["-o", input.name]) + if result.returncode != 0: + exit(1) + + output = NamedTemporaryFile(delete=False, prefix="output-", suffix=".rs") + output.close() + result = run_bindgen(input, output) + if result.returncode != 0: + cat(input.name) + cat(output.name) + exit(1) + + test = NamedTemporaryFile(delete=False, prefix="test-") + test.close() + result = run_rustc(output, test) + if result.returncode != 0: + cat(input.name) + cat(output.name) + exit(1) + + result = run_logged([test.name]) + if result.returncode != 0: + cat(input.name) + cat(output.name) + exit(1) + + os.remove(input.name) + os.remove(output.name) + os.remove(test.name) + iterations += 1 + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + exit() |