aboutsummaryrefslogtreecommitdiff
path: root/tests/drivers/analyzer_property_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/drivers/analyzer_property_test.py')
-rw-r--r--tests/drivers/analyzer_property_test.py28
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)')