diff options
Diffstat (limited to 'tests/drivers/analyzer_property_test.py')
| -rw-r--r-- | tests/drivers/analyzer_property_test.py | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/drivers/analyzer_property_test.py b/tests/drivers/analyzer_property_test.py new file mode 100644 index 0000000..d816f47 --- /dev/null +++ b/tests/drivers/analyzer_property_test.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +"""deterministic safe/invalid neighbors for ownership and projection analysis.""" +import argparse +import random +import subprocess + +parser = argparse.ArgumentParser() +parser.add_argument('host') +parser.add_argument('--cases', type=int, default=32) +args = parser.parse_args() +rng = random.Random(0xB0770) +for i in range(args.cases): + n = rng.randrange(1, 12); at = rng.randrange(n) + prefix = f'include rt; int* saved; fn main() {{ let p = rt.new(int, {n}); p[{at}] = {i}; ' + variants = [ + (f'return p[{at}]; }}', True), + (f'saved = p; return saved[{at}]; }}', True), + (f'saved = p; return p[{at}]; }}', False), + (f'rt.free(p); return p[{at}]; }}', False), + (f'int* q = p; rt.free(p); return q[{at}]; }}', False), + ] + for tail, accepted in variants: + src = prefix + tail + r = subprocess.run([args.host], input=src.encode(), capture_output=True, timeout=5) + text = (r.stdout + r.stderr).decode(errors='replace') + error = 'zc:' in text or r.returncode != 0 + assert r.returncode >= 0 and (not error) == accepted, (i, accepted, src, text) +print(f'ok {args.cases * 5} generated ownership accept/reject neighbors (seed 0xB0770)') |
