summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-09-25 16:04:17 -0500
committerGitHub <noreply@github.com>2017-09-25 16:04:17 -0500
commitc7970102cc44df3a7862c1d16ee2e23f4902835f (patch)
tree416738ca828aab2888caa00d42622ca8358a18a5
parent9113b7b51b189a4a8e4c2d59d8403e3f947239fe (diff)
parentba2db57c78df73cea85d227001d4b505b3a1fb9a (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--.gitignore3
-rw-r--r--csmith-fuzzing/driver.py107
2 files changed, 87 insertions, 23 deletions
diff --git a/.gitignore b/.gitignore
index b2bfe5aa..77cea935 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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()