nx_wasm_static_bounds_gate.nx source
↩ module page · 107 lines · 9236 B
1// Pure compiler layout tests: actual checked owner and emitted bytes, no CLI subprocess or deployment.
2import "nx_wasm_data.nx"
3import "nx_wasm_layout_lib.nx"
4import "nx_gate_verdict.nx"
5func wb_eq(a: *u8,an: i64,b: *u8,bn: i64) -> i64 {
6 if an!=bn { return 0 }; var i: i64=0
7 while i<an { if a[i]!=b[i] { return 0 }; i=i+1 }; return 1
8}
9func wb_strlen(s: *u8) -> i64 { var n: i64=0;while s[n]!=(0 as u8){n=n+1};return n }
10func wb_word(b: *u8,at: i64) -> i64 { var n: i64=0;var i: i64=0;while i<8{n=n|((b[at+i] as i64)<<(i*8));i=i+1};return n }
11func main() -> i64 {
12 let c: *i64=gv_ctr();gv_head("WASM-STATIC-BOUNDS / source-linked pure layout" as *u8)
13 gv_check("positive page" as *u8,wd_parse_pages("1" as *u8)==1,c)
14 gv_check("wasm32 last page" as *u8,wd_parse_pages("65536" as *u8)==65536,c)
15 gv_check("leading zero preserves complete integer" as *u8,wd_parse_pages("0001" as *u8)==1,c)
16 gv_check("zero refused" as *u8,wd_parse_pages("0" as *u8)<0,c)
17 gv_check("empty refused" as *u8,wd_parse_pages("" as *u8)<0,c)
18 gv_check("negative refused" as *u8,wd_parse_pages("-1" as *u8)<0,c)
19 gv_check("positive sign refused" as *u8,wd_parse_pages("+1" as *u8)<0,c)
20 gv_check("prefix digits refused" as *u8,wd_parse_pages("1x" as *u8)<0,c)
21 gv_check("leading space refused" as *u8,wd_parse_pages(" 1" as *u8)<0,c)
22 gv_check("trailing space refused" as *u8,wd_parse_pages("1 " as *u8)<0,c)
23 gv_check("above wasm32 pages refused" as *u8,wd_parse_pages("65537" as *u8)<0,c)
24 gv_check("signed integer overflow refused before multiplication" as *u8,wd_parse_pages("9223372036854775808" as *u8)<0,c)
25 gv_check("unsigned integer overflow refused before multiplication" as *u8,wd_parse_pages("18446744073709551616" as *u8)<0,c)
26 let m: *Module=sys_mmap(__size_of(Module)) as *Module
27 let globals: *u8=sys_mmap(WD_GLOBAL_STRIDE*2)
28 let payload: *u8=sys_mmap(WD_CELL)
29 if (m as i64)<=0 || (globals as i64)<=0 || (payload as i64)<=0 { gv_check("typed fixture allocated" as *u8,0,c);return gv_verdict("WASM-STATIC-BOUNDS" as *u8,c,"allocation failure" as *u8) }
30 m.globals=globals as *Global;m.n_globals=1
31 let g: *Global=globals as *Global
32 let h: *Global=(globals as i64+WD_GLOBAL_STRIDE) as *Global
33 payload[0]=1 as u8;payload[1]=2 as u8;payload[2]=3 as u8;payload[3]=4 as u8
34 g.len=4;g.is_string=1;g.zero_init=0;g.bytes=payload
35 gv_check("plain exact byte fit includes terminator" as *u8,wd_prepare_checked(m,1,0,WD_PAGE+5)==2,c)
36 gv_check("plain exact address and end" as *u8,wd_address(0)==WD_PAGE && wd_static_end_bytes==WD_PAGE+5,c)
37 gv_check("plain one byte short refused" as *u8,wd_prepare_checked(m,1,0,WD_PAGE+4)==0-11,c)
38 gv_check("shared exact fit includes alignment and initialization cell" as *u8,wd_prepare_checked(m,1,1,WD_PAGE+16)==2,c)
39 gv_check("shared initialization address and end exact" as *u8,wd_init_address==WD_PAGE+8 && wd_static_end_bytes==WD_PAGE+16,c)
40 gv_check("shared one byte short refused" as *u8,wd_prepare_checked(m,1,1,WD_PAGE+15)==0-11,c)
41 gv_check("limit below base refused" as *u8,wd_prepare_checked(m,1,0,WD_PAGE-1)==0-11,c)
42 gv_check("negative byte limit refused" as *u8,wd_prepare_checked(m,1,0,0-1)==0-11,c)
43 gv_check("arena multiplication overflow refused" as *u8,wd_prepare_checked(m,9223372036854775807,0,0)==0-10,c)
44 m.n_globals=2;h.len=1;h.is_string=0;h.zero_init=1
45 gv_check("second global alignment exact fit" as *u8,wd_prepare_checked(m,1,0,WD_PAGE+9)==2,c)
46 gv_check("second global actual aligned address" as *u8,wd_address(1)==WD_PAGE+8,c)
47 gv_check("second global one byte short" as *u8,wd_prepare_checked(m,1,0,WD_PAGE+8)==0-11,c)
48 m.n_globals=1;g.len=WD_PAGE;g.is_string=0
49 gv_check("wasm32 exact end allowed" as *u8,wd_prepare_checked(m,WD_MAX_BYTES/WD_PAGE-1,0,WD_MAX_BYTES)==WD_MAX_BYTES/WD_PAGE,c)
50 g.is_string=1
51 gv_check("wasm32 terminator overflow refused" as *u8,wd_prepare_checked(m,WD_MAX_BYTES/WD_PAGE-1,0,0)==0-7,c)
52 g.is_string=0
53 gv_check("wasm32 shared state overflow refused" as *u8,wd_prepare_checked(m,WD_MAX_BYTES/WD_PAGE-1,1,0)==0-8,c)
54 g.len=9223372036854775807
55 gv_check("global extent overflow refused without addition" as *u8,wd_prepare_checked(m,1,0,0)==0-6,c)
56 m.n_globals=0
57 gv_check("empty module exact base fit" as *u8,wd_prepare_checked(m,1,1,WD_PAGE)==1,c)
58 gv_check("empty module reserves no initialization state as before" as *u8,wd_init_address==0 && wd_static_end_bytes==WD_PAGE,c)
59 gv_check("empty module still rejects limit below base" as *u8,wd_prepare_checked(m,1,0,WD_PAGE-1)==0-11,c)
60 gv_check("internal zero-page empty layout preserves historical result" as *u8,wd_prepare_checked(m,0,0,0)==0,c)
61 gv_check("internal zero-page empty layout has zero base and end" as *u8,wd_static_base_bytes==0 && wd_static_end_bytes==0,c)
62 m.n_globals=1;g.len=4;g.is_string=1
63 gv_check("internal zero-page nonempty layout remains supported" as *u8,wd_prepare_checked(m,0,0,5)==1,c)
64 gv_check("internal zero-page actual global address" as *u8,wd_address(0)==0 && wd_static_end_bytes==5,c)
65 gv_check("internal negative-page layout refused" as *u8,wd_prepare_checked(m,0-1,0,0)==0-10,c)
66 let a: *OutBuf=out_new(WD_PAGE);let b: *OutBuf=out_new(WD_PAGE)
67 if (a as i64)<=0 || (b as i64)<=0 { gv_check("emission buffers allocated" as *u8,0,c);return gv_verdict("WASM-STATIC-BOUNDS" as *u8,c,"emission allocation failed" as *u8) }
68 if (a.buf as i64)<=0 || (b.buf as i64)<=0 { gv_check("emission storage allocated" as *u8,0,c);return gv_verdict("WASM-STATIC-BOUNDS" as *u8,c,"emission storage failed" as *u8) }
69 wd_arena_pages_flag=0;wd_static_limit_pages_flag=0
70 gv_check("unflagged plain wrapper keeps previous pages" as *u8,wd_prepare(m,1,0)==2,c)
71 wd_emit(m,a)
72 let oracle: *u8=" (data (i32.const 65536) \"\\01\\02\\03\\04\\00\")\n" as *u8
73 gv_check("unflagged emitted active bytes equal independent exact oracle" as *u8,wb_eq(a.buf,a.pos,oracle,wb_strlen(oracle)),c)
74 wd_arena_pages_flag=1;wd_static_limit_pages_flag=2
75 gv_check("arena override does not shrink existing memory minimum" as *u8,wd_prepare(m,3,0)==3,c)
76 wd_emit(m,b)
77 gv_check("bounded plain data bytes unchanged" as *u8,wb_eq(a.buf,a.pos,b.buf,b.pos),c)
78 a.pos=0;b.pos=0
79 wd_arena_pages_flag=0;wd_static_limit_pages_flag=0
80 gv_check("unflagged shared wrapper keeps previous pages" as *u8,wd_prepare(m,1,1)==2,c)
81 wd_emit_shared(m,a)
82 wd_arena_pages_flag=1;wd_static_limit_pages_flag=2
83 gv_check("bounded shared preserves engine memory minimum" as *u8,wd_prepare(m,3,1)==3,c)
84 wd_emit_shared(m,b)
85 gv_check("bounded passive data and initialization function bytes unchanged" as *u8,wb_eq(a.buf,a.pos,b.buf,b.pos),c)
86 gv_check("shared exact initialization state preserved" as *u8,wd_init_address==WD_PAGE+8,c)
87 let record_size: i64=WL_HEADER+WL_ROW
88 let old_record: *u8=sys_mmap(record_size);let bounded_record: *u8=sys_mmap(record_size)
89 if (old_record as i64)<=0 || (bounded_record as i64)<=0 { gv_check("record fixture allocated" as *u8,0,c);return gv_verdict("WASM-STATIC-BOUNDS" as *u8,c,"record allocation failed" as *u8) }
90 wd_arena_pages_flag=0;wd_static_limit_pages_flag=0
91 gv_check("unflagged record full extent" as *u8,wl_record(m,1,1,old_record,record_size)==record_size,c)
92 wd_arena_pages_flag=1;wd_static_limit_pages_flag=2
93 gv_check("bounded record full extent" as *u8,wl_record(m,1,1,bounded_record,record_size)==record_size,c)
94 gv_check("bounded record all bytes equal historical layout without memory override" as *u8,wb_eq(old_record,record_size,bounded_record,record_size),c)
95 gv_check("memory-minimum record full extent" as *u8,wl_record(m,3,1,bounded_record,record_size)==record_size,c)
96 gv_check("record base equals actual static base rather than memory minimum" as *u8,wb_word(bounded_record,24)==WD_PAGE && wd_static_base_bytes==WD_PAGE,c)
97 gv_check("record minimum equals actual declared memory minimum" as *u8,wb_word(bounded_record,32)==3,c)
98 gv_check("record global address equals actual address" as *u8,wb_word(bounded_record,WL_HEADER+8)==wd_address(0),c)
99 gv_check("record shared initialization exact address and bytes" as *u8,wb_word(bounded_record,40)==WD_PAGE+8 && wb_word(bounded_record,48)==WD_CELL,c)
100 wl_word(old_record,32,3)
101 gv_check("only recorded memory minimum changes when existing request is larger" as *u8,wb_eq(old_record,record_size,bounded_record,record_size),c)
102 wd_arena_pages_flag=0;wd_static_limit_pages_flag=0
103 gv_check("historical zero-page layout record remains accepted" as *u8,wl_record(m,0,0,bounded_record,record_size)==record_size,c)
104 gv_check("zero-page record retains base zero and derived page one" as *u8,wb_word(bounded_record,24)==0 && wb_word(bounded_record,32)==1 && wb_word(bounded_record,WL_HEADER+8)==0,c)
105 m.n_globals=0;wd_prepare_checked(m,1,0,0)
106 return gv_verdict("WASM-STATIC-BOUNDS" as *u8,c,"strict page integers and exact byte bounds include padding terminators and shared initialization; plain/shared emitted data unchanged; memory minimum retained; driver subprocess and real engine delivery require separate qualification" as *u8)
107}