aboutsummaryrefslogtreecommitdiff
path: root/tests/fuzz
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-02-23 15:55:23 -0800
committerAlon Zakai <alonzakai@gmail.com>2013-02-23 15:55:23 -0800
commitdbfd0c57fde6f0252a6c3142a6c0dea44b2270d7 (patch)
treebe86a4fb72611145cf11022b8acb600534b0b54d /tests/fuzz
parentc2692a1acba58bb6d47e148ee26328094f8f2c5c (diff)
move csmith driver
Diffstat (limited to 'tests/fuzz')
-rwxr-xr-xtests/fuzz/csmith_driver.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/fuzz/csmith_driver.py b/tests/fuzz/csmith_driver.py
new file mode 100755
index 00000000..fcf937f6
--- /dev/null
+++ b/tests/fuzz/csmith_driver.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+
+'''
+Runs csmith, a C fuzzer, and looks for bugs
+'''
+
+import os, sys, difflib
+from subprocess import Popen, PIPE, STDOUT
+
+sys.path += [os.path.join(os.path.dirname(os.path.dirname(__file__)), 'tools')]
+import shared
+
+CSMITH = os.path.expanduser('~/Dev/csmith/src/csmith')
+CSMITH_CFLAGS = ['-I' + os.path.expanduser('~/Dev/csmith/runtime/')]
+
+filename = os.path.join(shared.CANONICAL_TEMP_DIR, 'fuzzcode')
+
+shared.DEFAULT_TIMEOUT = 3
+
+tried = 0
+valid = 0
+
+while 1:
+ print 'Tried %d, valid: %d' % (tried, valid)
+ tried += 1
+ print '1) Generate C'
+ shared.execute([CSMITH, '--no-volatiles', '--no-math64', '--max-block-depth', '2', '--max-block-size', '2', '--max-expr-complexity', '2', '--max-funcs', '2'], stdout=open(filename + '.c', 'w'))
+
+ print '2) Compile natively'
+ shared.try_delete(filename)
+ shared.execute([shared.CLANG_CC, '-O2', filename + '.c', '-o', filename] + CSMITH_CFLAGS, stderr=PIPE)
+ assert os.path.exists(filename)
+ print '3) Run natively'
+ try:
+ correct = shared.timeout_run(Popen([filename], stdout=PIPE, stderr=PIPE), 3)
+ except Exception, e:
+ print 'Failed or infinite looping in native, skipping', e
+ continue
+ valid += 1
+
+ print '4) Compile JS-ly'
+ shared.try_delete(filename + '.js')
+ shared.execute([shared.EMCC, '-O2', '-s', 'ASM_JS=1', '-s', 'PRECISE_I64_MATH=1', '-s', 'PRECISE_I32_MUL=1', filename + '.c', '-o', filename + '.js'] + CSMITH_CFLAGS, stderr=PIPE)
+ assert os.path.exists(filename + '.js')
+ print '5) Run JS-ly'
+ js = shared.run_js(filename + '.js', stderr=PIPE) #, engine=...)
+
+ print '6) Verify'
+ assert correct == js, ''.join([a.rstrip()+'\n' for a in difflib.unified_diff(correct.split('\n'), js.split('\n'), fromfile='expected', tofile='actual')])
+