...
1;; Test the data section
2
3;; Syntax
4
5(module
6 (memory $m 1)
7 (data (i32.const 0))
8 (data (i32.const 1) "a" "" "bcd")
9 (data (offset (i32.const 0)))
10 (data (offset (i32.const 0)) "" "a" "bc" "")
11 (data (memory 0) (i32.const 0))
12 (data (memory 0x0) (i32.const 1) "a" "" "bcd")
13 (data (memory 0x000) (offset (i32.const 0)))
14 (data (memory 0) (offset (i32.const 0)) "" "a" "bc" "")
15 (data (memory $m) (i32.const 0))
16 (data (memory $m) (i32.const 1) "a" "" "bcd")
17 (data (memory $m) (offset (i32.const 0)))
18 (data (memory $m) (offset (i32.const 0)) "" "a" "bc" "")
19 (data $d1 (i32.const 0))
20 (data $d2 (i32.const 1) "a" "" "bcd")
21 (data $d3 (offset (i32.const 0)))
22 (data $d4 (offset (i32.const 0)) "" "a" "bc" "")
23 (data $d5 (memory 0) (i32.const 0))
24 (data $d6 (memory 0x0) (i32.const 1) "a" "" "bcd")
25 (data $d7 (memory 0x000) (offset (i32.const 0)))
26 (data $d8 (memory 0) (offset (i32.const 0)) "" "a" "bc" "")
27 (data $d9 (memory $m) (i32.const 0))
28 (data $d10 (memory $m) (i32.const 1) "a" "" "bcd")
29 (data $d11 (memory $m) (offset (i32.const 0)))
30 (data $d12 (memory $m) (offset (i32.const 0)) "" "a" "bc" "")
31)
32
33;; Basic use
34
35(module
36 (memory 1)
37 (data (i32.const 0) "a")
38)
39(module
40 (import "spectest" "memory" (memory 1))
41 (data (i32.const 0) "a")
42)
43
44(module
45 (memory 1)
46 (data (i32.const 0) "a")
47 (data (i32.const 3) "b")
48 (data (i32.const 100) "cde")
49 (data (i32.const 5) "x")
50 (data (i32.const 3) "c")
51)
52(module
53 (import "spectest" "memory" (memory 1))
54 (data (i32.const 0) "a")
55 (data (i32.const 1) "b")
56 (data (i32.const 2) "cde")
57 (data (i32.const 3) "f")
58 (data (i32.const 2) "g")
59 (data (i32.const 1) "h")
60)
61
62(module
63 (global (import "spectest" "global_i32") i32)
64 (memory 1)
65 (data (global.get 0) "a")
66)
67(module
68 (global (import "spectest" "global_i32") i32)
69 (import "spectest" "memory" (memory 1))
70 (data (global.get 0) "a")
71)
72
73(module
74 (global $g (import "spectest" "global_i32") i32)
75 (memory 1)
76 (data (global.get $g) "a")
77)
78(module
79 (global $g (import "spectest" "global_i32") i32)
80 (import "spectest" "memory" (memory 1))
81 (data (global.get $g) "a")
82)
83
84(assert_invalid
85 (module (memory 1) (global i32 (i32.const 0)) (data (global.get 0) "a"))
86 "unknown global"
87)
88(assert_invalid
89 (module (memory 1) (global $g i32 (i32.const 0)) (data (global.get $g) "a"))
90 "unknown global"
91)
92
93
94;; Corner cases
95
96(module
97 (memory 1)
98 (data (i32.const 0) "a")
99 (data (i32.const 0xffff) "b")
100)
101(module
102 (import "spectest" "memory" (memory 1))
103 (data (i32.const 0) "a")
104 (data (i32.const 0xffff) "b")
105)
106
107(module
108 (memory 2)
109 (data (i32.const 0x1_ffff) "a")
110)
111
112(module
113 (memory 0)
114 (data (i32.const 0))
115)
116(module
117 (import "spectest" "memory" (memory 0))
118 (data (i32.const 0))
119)
120
121(module
122 (memory 0 0)
123 (data (i32.const 0))
124)
125
126(module
127 (memory 1)
128 (data (i32.const 0x1_0000) "")
129)
130
131(module
132 (memory 0)
133 (data (i32.const 0) "" "")
134)
135(module
136 (import "spectest" "memory" (memory 0))
137 (data (i32.const 0) "" "")
138)
139
140(module
141 (memory 0 0)
142 (data (i32.const 0) "" "")
143)
144
145(module
146 (import "spectest" "memory" (memory 0))
147 (data (i32.const 0) "a")
148)
149
150(module
151 (import "spectest" "memory" (memory 0 3))
152 (data (i32.const 0) "a")
153)
154
155(module
156 (global (import "spectest" "global_i32") i32)
157 (import "spectest" "memory" (memory 0))
158 (data (global.get 0) "a")
159)
160
161(module
162 (global (import "spectest" "global_i32") i32)
163 (import "spectest" "memory" (memory 0 3))
164 (data (global.get 0) "a")
165)
166
167(module
168 (import "spectest" "memory" (memory 0))
169 (data (i32.const 1) "a")
170)
171
172(module
173 (import "spectest" "memory" (memory 0 3))
174 (data (i32.const 1) "a")
175)
176
177;; Invalid bounds for data
178
179(assert_trap
180 (module
181 (memory 0)
182 (data (i32.const 0) "a")
183 )
184 "out of bounds memory access"
185)
186
187(assert_trap
188 (module
189 (memory 0 0)
190 (data (i32.const 0) "a")
191 )
192 "out of bounds memory access"
193)
194
195(assert_trap
196 (module
197 (memory 0 1)
198 (data (i32.const 0) "a")
199 )
200 "out of bounds memory access"
201)
202(assert_trap
203 (module
204 (memory 0)
205 (data (i32.const 1))
206 )
207 "out of bounds memory access"
208)
209(assert_trap
210 (module
211 (memory 0 1)
212 (data (i32.const 1))
213 )
214 "out of bounds memory access"
215)
216
217;; This seems to cause a time-out on Travis.
218(;assert_unlinkable
219 (module
220 (memory 0x10000)
221 (data (i32.const 0xffffffff) "ab")
222 )
223 "" ;; either out of memory or out of bounds
224;)
225
226(assert_trap
227 (module
228 (global (import "spectest" "global_i32") i32)
229 (memory 0)
230 (data (global.get 0) "a")
231 )
232 "out of bounds memory access"
233)
234
235(assert_trap
236 (module
237 (memory 1 2)
238 (data (i32.const 0x1_0000) "a")
239 )
240 "out of bounds memory access"
241)
242(assert_trap
243 (module
244 (import "spectest" "memory" (memory 1))
245 (data (i32.const 0x1_0000) "a")
246 )
247 "out of bounds memory access"
248)
249
250(assert_trap
251 (module
252 (memory 2)
253 (data (i32.const 0x2_0000) "a")
254 )
255 "out of bounds memory access"
256)
257
258(assert_trap
259 (module
260 (memory 2 3)
261 (data (i32.const 0x2_0000) "a")
262 )
263 "out of bounds memory access"
264)
265
266(assert_trap
267 (module
268 (memory 1)
269 (data (i32.const -1) "a")
270 )
271 "out of bounds memory access"
272)
273(assert_trap
274 (module
275 (import "spectest" "memory" (memory 1))
276 (data (i32.const -1) "a")
277 )
278 "out of bounds memory access"
279)
280
281(assert_trap
282 (module
283 (memory 2)
284 (data (i32.const -100) "a")
285 )
286 "out of bounds memory access"
287)
288(assert_trap
289 (module
290 (import "spectest" "memory" (memory 1))
291 (data (i32.const -100) "a")
292 )
293 "out of bounds memory access"
294)
295
296;; Data without memory
297
298(assert_invalid
299 (module
300 (data (i32.const 0) "")
301 )
302 "unknown memory"
303)
304
305;; Data segment with memory index 1 (only memory 0 available)
306(assert_invalid
307 (module binary
308 "\00asm" "\01\00\00\00"
309 "\05\03\01" ;; memory section
310 "\00\00" ;; memory 0
311 "\0b\07\01" ;; data section
312 "\02\01\41\00\0b" ;; active data segment 0 for memory 1
313 "\00" ;; empty vec(byte)
314 )
315 "unknown memory 1"
316)
317
318;; Data segment with memory index 0 (no memory section)
319(assert_invalid
320 (module binary
321 "\00asm" "\01\00\00\00"
322 "\0b\06\01" ;; data section
323 "\00\41\00\0b" ;; active data segment 0 for memory 0
324 "\00" ;; empty vec(byte)
325 )
326 "unknown memory 0"
327)
328
329;; Data segment with memory index 1 (no memory section)
330(assert_invalid
331 (module binary
332 "\00asm" "\01\00\00\00"
333 "\0b\07\01" ;; data section
334 "\02\01\41\00\0b" ;; active data segment 0 for memory 1
335 "\00" ;; empty vec(byte)
336 )
337 "unknown memory 1"
338)
339
340;; Data segment with memory index 1 and vec(byte) as above,
341;; only memory 0 available.
342(assert_invalid
343 (module binary
344 "\00asm" "\01\00\00\00"
345 "\05\03\01" ;; memory section
346 "\00\00" ;; memory 0
347 "\0b\45\01" ;; data section
348 "\02" ;; active segment
349 "\01" ;; memory index
350 "\41\00\0b" ;; offset constant expression
351 "\3e" ;; vec(byte) length
352 "\00\01\02\03\04\05\06\07\08\09\0a\0b\0c\0d\0e\0f"
353 "\10\11\12\13\14\15\16\17\18\19\1a\1b\1c\1d\1e\1f"
354 "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f"
355 "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d"
356 )
357 "unknown memory 1"
358)
359
360;; Data segment with memory index 1 and specially crafted vec(byte) after.
361;; This is to detect incorrect validation where memory index is interpreted
362;; as a flag followed by "\41" interpreted as the size of vec(byte)
363;; with the expected number of bytes following.
364(assert_invalid
365 (module binary
366 "\00asm" "\01\00\00\00"
367 "\0b\45\01" ;; data section
368 "\02" ;; active segment
369 "\01" ;; memory index
370 "\41\00\0b" ;; offset constant expression
371 "\3e" ;; vec(byte) length
372 "\00\01\02\03\04\05\06\07\08\09\0a\0b\0c\0d\0e\0f"
373 "\10\11\12\13\14\15\16\17\18\19\1a\1b\1c\1d\1e\1f"
374 "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f"
375 "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d"
376 )
377 "unknown memory 1"
378)
379
380
381;; Invalid offsets
382
383(assert_invalid
384 (module
385 (memory 1)
386 (data (i64.const 0))
387 )
388 "type mismatch"
389)
390
391(assert_invalid
392 (module
393 (memory 1)
394 (data (ref.null func))
395 )
396 "type mismatch"
397)
398
399(assert_invalid
400 (module
401 (memory 1)
402 (data (offset (;empty instruction sequence;)))
403 )
404 "type mismatch"
405)
406
407(assert_invalid
408 (module
409 (memory 1)
410 (data (offset (i32.const 0) (i32.const 0)))
411 )
412 "type mismatch"
413)
414
415(assert_invalid
416 (module
417 (global (import "test" "global-i32") i32)
418 (memory 1)
419 (data (offset (global.get 0) (global.get 0)))
420 )
421 "type mismatch"
422)
423
424(assert_invalid
425 (module
426 (global (import "test" "global-i32") i32)
427 (memory 1)
428 (data (offset (global.get 0) (i32.const 0)))
429 )
430 "type mismatch"
431)
432
433(assert_invalid
434 (module
435 (memory 1)
436 (data (i32.ctz (i32.const 0)))
437 )
438 "constant expression required"
439)
440
441(assert_invalid
442 (module
443 (memory 1)
444 (data (nop))
445 )
446 "constant expression required"
447)
448
449(assert_invalid
450 (module
451 (memory 1)
452 (data (offset (nop) (i32.const 0)))
453 )
454 "constant expression required"
455)
456
457(assert_invalid
458 (module
459 (memory 1)
460 (data (offset (i32.const 0) (nop)))
461 )
462 "constant expression required"
463)
464
465(assert_invalid
466 (module
467 (global $g (import "test" "g") (mut i32))
468 (memory 1)
469 (data (global.get $g))
470 )
471 "constant expression required"
472)
473
474(assert_invalid
475 (module
476 (memory 1)
477 (data (global.get 0))
478 )
479 "unknown global 0"
480)
481
482(assert_invalid
483 (module
484 (global (import "test" "global-i32") i32)
485 (memory 1)
486 (data (global.get 1))
487 )
488 "unknown global 1"
489)
490
491(assert_invalid
492 (module
493 (global (import "test" "global-mut-i32") (mut i32))
494 (memory 1)
495 (data (global.get 0))
496 )
497 "constant expression required"
498)
View as plain text