summaryrefslogtreecommitdiff
path: root/scripts/fuzz_passes.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/fuzz_passes.py')
-rwxr-xr-xscripts/fuzz_passes.py156
1 files changed, 78 insertions, 78 deletions
diff --git a/scripts/fuzz_passes.py b/scripts/fuzz_passes.py
index 60ae95817..678e132c3 100755
--- a/scripts/fuzz_passes.py
+++ b/scripts/fuzz_passes.py
@@ -58,90 +58,90 @@ args = sys.argv[2:]
def run():
- if os.path.exists(wast):
- print('>>> running using a wast of size', os.stat(wast).st_size)
- cmd = ['mozjs', base] + args
- try:
- return subprocess.check_output(cmd, stderr=subprocess.STDOUT)
- except Exception as e:
- print(">>> !!! ", e, " !!!")
+ if os.path.exists(wast):
+ print('>>> running using a wast of size', os.stat(wast).st_size)
+ cmd = ['mozjs', base] + args
+ try:
+ return subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ except Exception as e:
+ print(">>> !!! ", e, " !!!")
original_wast = None
try:
- # get normal output
-
- normal = run()
- print('>>> normal output:\n', normal)
- assert normal, 'must be output'
-
- # ensure we actually use the wast
-
- original_wast = wast + '.original.wast'
- shutil.move(wast, original_wast)
- assert run() != normal, 'running without the wast must fail'
-
- # ensure a bad pass makes it fail
-
- def apply_passes(passes):
- wasm_opt = os.path.join('bin', 'wasm-opt')
- subprocess.check_call([wasm_opt, original_wast] + passes + ['-o', wast])
+ # get normal output
+
+ normal = run()
+ print('>>> normal output:\n', normal)
+ assert normal, 'must be output'
+
+ # ensure we actually use the wast
+
+ original_wast = wast + '.original.wast'
+ shutil.move(wast, original_wast)
+ assert run() != normal, 'running without the wast must fail'
+
+ # ensure a bad pass makes it fail
+
+ def apply_passes(passes):
+ wasm_opt = os.path.join('bin', 'wasm-opt')
+ subprocess.check_call([wasm_opt, original_wast] + passes + ['-o', wast])
+
+ apply_passes(['--remove-imports'])
+ assert run() != normal, 'running after a breaking pass must fail'
+
+ # loop, looking for failures
+
+ def simplify(passes):
+ # passes is known to fail, try to simplify down by removing
+ more = True
+ while more:
+ more = False
+ print('>>> trying to reduce:', ' '.join(passes), ' [' + str(len(passes)) + ']')
+ for i in range(len(passes)):
+ smaller = passes[:i] + passes[i + 1:]
+ print('>>>>>> try to reduce to:', ' '.join(smaller), ' [' + str(len(smaller)) + ']')
+ try:
+ apply_passes(smaller)
+ assert run() == normal
+ except Exception:
+ # this failed too, so it's a good reduction
+ passes = smaller
+ print('>>> reduction successful')
+ more = True
+ break
+ print('>>> reduced to:', ' '.join(passes))
+
+ tested = set()
+
+ def pick_passes():
+ ret = []
+ while 1:
+ str_ret = str(ret)
+ if random.random() < 0.1 and str_ret not in tested:
+ tested.add(str_ret)
+ return ret
+ ret.append('--' + random.choice(PASSES))
+
+ counter = 0
- apply_passes(['--remove-imports'])
- assert run() != normal, 'running after a breaking pass must fail'
-
- # loop, looking for failures
-
- def simplify(passes):
- # passes is known to fail, try to simplify down by removing
- more = True
- while more:
- more = False
- print('>>> trying to reduce:', ' '.join(passes), ' [' + str(len(passes)) + ']')
- for i in range(len(passes)):
- smaller = passes[:i] + passes[i + 1:]
- print('>>>>>> try to reduce to:', ' '.join(smaller), ' [' + str(len(smaller)) + ']')
- try:
- apply_passes(smaller)
- assert run() == normal
- except Exception:
- # this failed too, so it's a good reduction
- passes = smaller
- print('>>> reduction successful')
- more = True
- break
- print('>>> reduced to:', ' '.join(passes))
-
- tested = set()
-
- def pick_passes():
- ret = []
while 1:
- str_ret = str(ret)
- if random.random() < 0.1 and str_ret not in tested:
- tested.add(str_ret)
- return ret
- ret.append('--' + random.choice(PASSES))
-
- counter = 0
-
- while 1:
- passes = pick_passes()
- print('>>> [' + str(counter) + '] testing:', ' '.join(passes))
- counter += 1
- try:
- apply_passes(passes)
- except Exception as e:
- print(e)
- simplify(passes)
- break
- seen = run()
- if seen != normal:
- print('>>> bad output:\n', seen)
- simplify(passes)
- break
+ passes = pick_passes()
+ print('>>> [' + str(counter) + '] testing:', ' '.join(passes))
+ counter += 1
+ try:
+ apply_passes(passes)
+ except Exception as e:
+ print(e)
+ simplify(passes)
+ break
+ seen = run()
+ if seen != normal:
+ print('>>> bad output:\n', seen)
+ simplify(passes)
+ break
finally:
- if original_wast:
- shutil.move(original_wast, wast)
+ if original_wast:
+ shutil.move(original_wast, wast)