github.com/tetratelabs/wazero@v1.2.1/internal/integration_test/spectest/v2/testdata/binary.wast (about)

     1  (module binary "\00asm\01\00\00\00")
     2  (module binary "\00asm" "\01\00\00\00")
     3  (module $M1 binary "\00asm\01\00\00\00")
     4  (module $M2 binary "\00asm" "\01\00\00\00")
     5  
     6  (assert_malformed (module binary "") "unexpected end")
     7  (assert_malformed (module binary "\01") "unexpected end")
     8  (assert_malformed (module binary "\00as") "unexpected end")
     9  (assert_malformed (module binary "asm\00") "magic header not detected")
    10  (assert_malformed (module binary "msa\00") "magic header not detected")
    11  (assert_malformed (module binary "msa\00\01\00\00\00") "magic header not detected")
    12  (assert_malformed (module binary "msa\00\00\00\00\01") "magic header not detected")
    13  (assert_malformed (module binary "asm\01\00\00\00\00") "magic header not detected")
    14  (assert_malformed (module binary "wasm\01\00\00\00") "magic header not detected")
    15  (assert_malformed (module binary "\7fasm\01\00\00\00") "magic header not detected")
    16  (assert_malformed (module binary "\80asm\01\00\00\00") "magic header not detected")
    17  (assert_malformed (module binary "\82asm\01\00\00\00") "magic header not detected")
    18  (assert_malformed (module binary "\ffasm\01\00\00\00") "magic header not detected")
    19  
    20  ;; 8-byte endian-reversed.
    21  (assert_malformed (module binary "\00\00\00\01msa\00") "magic header not detected")
    22  
    23  ;; Middle-endian byte orderings.
    24  (assert_malformed (module binary "a\00ms\00\01\00\00") "magic header not detected")
    25  (assert_malformed (module binary "sm\00a\00\00\01\00") "magic header not detected")
    26  
    27  ;; Upper-cased.
    28  (assert_malformed (module binary "\00ASM\01\00\00\00") "magic header not detected")
    29  
    30  ;; EBCDIC-encoded magic.
    31  (assert_malformed (module binary "\00\81\a2\94\01\00\00\00") "magic header not detected")
    32  
    33  ;; Leading UTF-8 BOM.
    34  (assert_malformed (module binary "\ef\bb\bf\00asm\01\00\00\00") "magic header not detected")
    35  
    36  ;; Malformed binary version.
    37  (assert_malformed (module binary "\00asm") "unexpected end")
    38  (assert_malformed (module binary "\00asm\01") "unexpected end")
    39  (assert_malformed (module binary "\00asm\01\00\00") "unexpected end")
    40  (assert_malformed (module binary "\00asm\00\00\00\00") "unknown binary version")
    41  (assert_malformed (module binary "\00asm\0d\00\00\00") "unknown binary version")
    42  (assert_malformed (module binary "\00asm\0e\00\00\00") "unknown binary version")
    43  (assert_malformed (module binary "\00asm\00\01\00\00") "unknown binary version")
    44  (assert_malformed (module binary "\00asm\00\00\01\00") "unknown binary version")
    45  (assert_malformed (module binary "\00asm\00\00\00\01") "unknown binary version")
    46  
    47  ;; Invalid section id.
    48  (assert_malformed (module binary "\00asm" "\01\00\00\00" "\0e\01\00") "malformed section id")
    49  (assert_malformed (module binary "\00asm" "\01\00\00\00" "\7f\01\00") "malformed section id")
    50  (assert_malformed (module binary "\00asm" "\01\00\00\00" "\80\01\00\01\01\00") "malformed section id")
    51  (assert_malformed (module binary "\00asm" "\01\00\00\00" "\81\01\00\01\01\00") "malformed section id")
    52  (assert_malformed (module binary "\00asm" "\01\00\00\00" "\ff\01\00\01\01\00") "malformed section id")
    53  
    54  ;; Function with missing end marker (between two functions)
    55  (assert_malformed
    56    (module binary
    57      "\00asm" "\01\00\00\00"
    58      "\01\04\01\60\00\00"       ;; Type section: 1 type
    59      "\03\03\02\00\00"          ;; Function section: 2 functions
    60      "\0a\0c\02"                ;; Code section: 2 functions
    61      ;; function 0
    62      "\04\00"                   ;; Function size and local type count
    63      "\41\01"                   ;; i32.const 1
    64      "\1a"                      ;; drop
    65      ;; Missing end marker here
    66      ;; function 1
    67      "\05\00"                   ;; Function size and local type count
    68      "\41\01"                   ;; i32.const 1
    69      "\1a"                      ;; drop
    70      "\0b"                      ;; end
    71    )
    72    "END opcode expected"
    73  )
    74  
    75  ;; Function with missing end marker (at EOF)
    76  (assert_malformed
    77    (module binary
    78      "\00asm" "\01\00\00\00"
    79      "\01\04\01\60\00\00"       ;; Type section: 1 type
    80      "\03\02\01\00"             ;; Function section: 1 function
    81      "\0a\06\01"                ;; Code section: 1 function
    82      ;; function 0
    83      "\04\00"                   ;; Function size and local type count
    84      "\41\01"                   ;; i32.const 1
    85      "\1a"                      ;; drop
    86      ;; Missing end marker here
    87    )
    88    "unexpected end of section or function"
    89  )
    90  
    91  ;; Function with missing end marker (at end of code sections)
    92  (assert_malformed
    93    (module binary
    94      "\00asm" "\01\00\00\00"
    95      "\01\04\01\60\00\00"       ;; Type section: 1 type
    96      "\03\02\01\00"             ;; Function section: 1 function
    97      "\0a\06\01"                ;; Code section: 1 function
    98      ;; function 0
    99      "\04\00"                   ;; Function size and local type count
   100      "\41\01"                   ;; i32.const 1
   101      "\1a"                      ;; drop
   102      ;; Missing end marker here
   103      "\0b\03\01\01\00"          ;; Data section
   104    )
   105    ;; The spec interpreter consumes the `\0b` (data section start) as an
   106    ;; END instruction (also happens to be `\0b`) and reports the code section as
   107    ;; being larger than declared.
   108    "section size mismatch"
   109  )
   110  
   111  ;; Init expression with missing end marker
   112  (assert_malformed
   113    (module binary
   114      "\00asm" "\01\00\00\00"
   115      "\01\04\01\60\00\00"       ;; Type section: 1 type
   116      "\03\02\01\00"             ;; Function section: 1 function
   117      "\06\05\01\7f\00\41\00"    ;; Global section: 1 entry with missing end marker
   118      ;; Missing end marker here
   119      "\0a\04\01\02\00\0b"       ;; Code section: 1 function
   120    )
   121    "illegal opcode"
   122  )
   123  
   124  ;; memory.grow reserved byte equal to zero.
   125  (assert_malformed
   126    (module binary
   127      "\00asm" "\01\00\00\00"
   128      "\01\04\01\60\00\00"       ;; Type section
   129      "\03\02\01\00"             ;; Function section
   130      "\05\03\01\00\00"          ;; Memory section
   131      "\0a\09\01"                ;; Code section
   132  
   133      ;; function 0
   134      "\07\00"
   135      "\41\00"                   ;; i32.const 0
   136      "\40"                      ;; memory.grow
   137      "\01"                      ;; memory.grow reserved byte is not equal to zero!
   138      "\1a"                      ;; drop
   139      "\0b"                      ;; end
   140    )
   141    "zero byte expected"
   142  )
   143  
   144  ;; memory.grow reserved byte should not be a "long" LEB128 zero.
   145  (assert_malformed
   146    (module binary
   147      "\00asm" "\01\00\00\00"
   148      "\01\04\01\60\00\00"       ;; Type section
   149      "\03\02\01\00"             ;; Function section
   150      "\05\03\01\00\00"          ;; Memory section
   151      "\0a\0a\01"                ;; Code section
   152  
   153      ;; function 0
   154      "\08\00"
   155      "\41\00"                   ;; i32.const 0
   156      "\40"                      ;; memory.grow
   157      "\80\00"                   ;; memory.grow reserved byte
   158      "\1a"                      ;; drop
   159      "\0b"                      ;; end
   160    )
   161    "zero byte expected"
   162  )
   163  
   164  ;; Same as above for 3, 4, and 5-byte zero encodings.
   165  (assert_malformed
   166    (module binary
   167      "\00asm" "\01\00\00\00"
   168      "\01\04\01\60\00\00"       ;; Type section
   169      "\03\02\01\00"             ;; Function section
   170      "\05\03\01\00\00"          ;; Memory section
   171      "\0a\0b\01"                ;; Code section
   172  
   173      ;; function 0
   174      "\09\00"
   175      "\41\00"                   ;; i32.const 0
   176      "\40"                      ;; memory.grow
   177      "\80\80\00"                ;; memory.grow reserved byte
   178      "\1a"                      ;; drop
   179      "\0b"                      ;; end
   180    )
   181    "zero byte expected"
   182  )
   183  
   184  (assert_malformed
   185    (module binary
   186      "\00asm" "\01\00\00\00"
   187      "\01\04\01\60\00\00"       ;; Type section
   188      "\03\02\01\00"             ;; Function section
   189      "\05\03\01\00\00"          ;; Memory section
   190      "\0a\0c\01"                ;; Code section
   191  
   192      ;; function 0
   193      "\0a\00"
   194      "\41\00"                   ;; i32.const 0
   195      "\40"                      ;; memory.grow
   196      "\80\80\80\00"             ;; memory.grow reserved byte
   197      "\1a"                      ;; drop
   198      "\0b"                      ;; end
   199    )
   200    "zero byte expected"
   201  )
   202  
   203  (assert_malformed
   204    (module binary
   205      "\00asm" "\01\00\00\00"
   206      "\01\04\01\60\00\00"       ;; Type section
   207      "\03\02\01\00"             ;; Function section
   208      "\05\03\01\00\00"          ;; Memory section
   209      "\0a\0d\01"                ;; Code section
   210  
   211      ;; function 0
   212      "\0b\00"
   213      "\41\00"                   ;; i32.const 0
   214      "\40"                      ;; memory.grow
   215      "\80\80\80\80\00"          ;; memory.grow reserved byte
   216      "\1a"                      ;; drop
   217      "\0b"                      ;; end
   218    )
   219    "zero byte expected"
   220  )
   221  
   222  ;; memory.size reserved byte equal to zero.
   223  (assert_malformed
   224    (module binary
   225      "\00asm" "\01\00\00\00"
   226      "\01\04\01\60\00\00"       ;; Type section
   227      "\03\02\01\00"             ;; Function section
   228      "\05\03\01\00\00"          ;; Memory section
   229      "\0a\07\01"                ;; Code section
   230  
   231      ;; function 0
   232      "\05\00"
   233      "\3f"                      ;; memory.size
   234      "\01"                      ;; memory.size reserved byte is not equal to zero!
   235      "\1a"                      ;; drop
   236      "\0b"                      ;; end
   237    )
   238    "zero byte expected"
   239  )
   240  
   241  ;; memory.size reserved byte should not be a "long" LEB128 zero.
   242  (assert_malformed
   243    (module binary
   244      "\00asm" "\01\00\00\00"
   245      "\01\04\01\60\00\00"       ;; Type section
   246      "\03\02\01\00"             ;; Function section
   247      "\05\03\01\00\00"          ;; Memory section
   248      "\0a\08\01"                ;; Code section
   249  
   250      ;; function 0
   251      "\06\00"
   252      "\3f"                      ;; memory.size
   253      "\80\00"                   ;; memory.size reserved byte
   254      "\1a"                      ;; drop
   255      "\0b"                      ;; end
   256    )
   257    "zero byte expected"
   258  )
   259  
   260  ;; Same as above for 3, 4, and 5-byte zero encodings.
   261  (assert_malformed
   262    (module binary
   263      "\00asm" "\01\00\00\00"
   264      "\01\04\01\60\00\00"       ;; Type section
   265      "\03\02\01\00"             ;; Function section
   266      "\05\03\01\00\00"          ;; Memory section
   267      "\0a\09\01"                ;; Code section
   268  
   269      ;; function 0
   270      "\07\00"
   271      "\3f"                      ;; memory.size
   272      "\80\80\00"                ;; memory.size reserved byte
   273      "\1a"                      ;; drop
   274      "\0b"                      ;; end
   275    )
   276    "zero byte expected"
   277  )
   278  
   279  (assert_malformed
   280    (module binary
   281      "\00asm" "\01\00\00\00"
   282      "\01\04\01\60\00\00"       ;; Type section
   283      "\03\02\01\00"             ;; Function section
   284      "\05\03\01\00\00"          ;; Memory section
   285      "\0a\0a\01"                ;; Code section
   286  
   287      ;; function 0
   288      "\08\00"
   289      "\3f"                      ;; memory.size
   290      "\80\80\80\00"             ;; memory.size reserved byte
   291      "\1a"                      ;; drop
   292      "\0b"                      ;; end
   293    )
   294    "zero byte expected"
   295  )
   296  
   297  (assert_malformed
   298    (module binary
   299      "\00asm" "\01\00\00\00"
   300      "\01\04\01\60\00\00"       ;; Type section
   301      "\03\02\01\00"             ;; Function section
   302      "\05\03\01\00\00"          ;; Memory section
   303      "\0a\0b\01"                ;; Code section
   304  
   305      ;; function 0
   306      "\09\00"
   307      "\3f"                      ;; memory.size
   308      "\80\80\80\80\00"          ;; memory.size reserved byte
   309      "\1a"                      ;; drop
   310      "\0b"                      ;; end
   311    )
   312    "zero byte expected"
   313  )
   314  
   315  ;; Local number is unsigned 32 bit
   316  (assert_malformed
   317    (module binary
   318      "\00asm" "\01\00\00\00"
   319      "\01\04\01\60\00\00"       ;; Type section
   320      "\03\02\01\00"             ;; Function section
   321      "\0a\0c\01"                ;; Code section
   322  
   323      ;; function 0
   324      "\0a\02"
   325      "\80\80\80\80\10\7f"       ;; 0x100000000 i32
   326      "\02\7e"                   ;; 0x00000002 i64
   327      "\0b"                      ;; end
   328    )
   329    "integer too large"
   330  )
   331  
   332  ;; Local number is unsigned 32 bit
   333  (assert_malformed
   334    (module binary
   335      "\00asm" "\01\00\00\00"
   336      "\01\04\01\60\00\00"       ;; Type section
   337      "\03\02\01\00"             ;; Function section
   338      "\0a\0c\01"                ;; Code section
   339  
   340      ;; function 0
   341      "\0a\02"
   342      "\80\80\80\80\10\7f"       ;; 0x100000000 i32
   343      "\02\7e"                   ;; 0x00000002 i64
   344      "\0b"                      ;; end
   345    )
   346    "integer too large"
   347  )
   348  
   349  ;; No more than 2^32-1 locals.
   350  (assert_malformed
   351    (module binary
   352      "\00asm" "\01\00\00\00"
   353      "\01\04\01\60\00\00"       ;; Type section
   354      "\03\02\01\00"             ;; Function section
   355      "\0a\0c\01"                ;; Code section
   356  
   357      ;; function 0
   358      "\0a\02"
   359      "\ff\ff\ff\ff\0f\7f"       ;; 0xFFFFFFFF i32
   360      "\02\7e"                   ;; 0x00000002 i64
   361      "\0b"                      ;; end
   362    )
   363    "too many locals"
   364  )
   365  
   366  (assert_malformed
   367    (module binary
   368      "\00asm" "\01\00\00\00"
   369      "\01\06\01\60\02\7f\7f\00" ;; Type section: (param i32 i32)
   370      "\03\02\01\00"             ;; Function section
   371      "\0a\1c\01"                ;; Code section
   372  
   373      ;; function 0
   374      "\1a\04"
   375      "\80\80\80\80\04\7f"       ;; 0x40000000 i32
   376      "\80\80\80\80\04\7e"       ;; 0x40000000 i64
   377      "\80\80\80\80\04\7d"       ;; 0x40000000 f32
   378      "\80\80\80\80\04\7c"       ;; 0x40000000 f64
   379      "\0b"                      ;; end
   380    )
   381    "too many locals"
   382  )
   383  
   384  ;; Local count can be 0.
   385  (module binary
   386    "\00asm" "\01\00\00\00"
   387    "\01\04\01\60\00\00"     ;; Type section
   388    "\03\02\01\00"           ;; Function section
   389    "\0a\0a\01"              ;; Code section
   390  
   391    ;; function 0
   392    "\08\03"
   393    "\00\7f"                 ;; 0 i32
   394    "\00\7e"                 ;; 0 i64
   395    "\02\7d"                 ;; 2 f32
   396    "\0b"                    ;; end
   397  )
   398  
   399  ;; Function section has non-zero count, but code section is absent.
   400  (assert_malformed
   401    (module binary
   402      "\00asm" "\01\00\00\00"
   403      "\01\04\01\60\00\00"  ;; Type section
   404      "\03\03\02\00\00"     ;; Function section with 2 functions
   405    )
   406    "function and code section have inconsistent lengths"
   407  )
   408  
   409  ;; Code section has non-zero count, but function section is absent.
   410  (assert_malformed
   411    (module binary
   412      "\00asm" "\01\00\00\00"
   413      "\0a\04\01\02\00\0b"  ;; Code section with 1 empty function
   414    )
   415    "function and code section have inconsistent lengths"
   416  )
   417  
   418  ;; Function section count > code section count
   419  (assert_malformed
   420    (module binary
   421      "\00asm" "\01\00\00\00"
   422      "\01\04\01\60\00\00"  ;; Type section
   423      "\03\03\02\00\00"     ;; Function section with 2 functions
   424      "\0a\04\01\02\00\0b"  ;; Code section with 1 empty function
   425    )
   426    "function and code section have inconsistent lengths"
   427  )
   428  
   429  ;; Function section count < code section count
   430  (assert_malformed
   431    (module binary
   432      "\00asm" "\01\00\00\00"
   433      "\01\04\01\60\00\00"           ;; Type section
   434      "\03\02\01\00"                 ;; Function section with 1 function
   435      "\0a\07\02\02\00\0b\02\00\0b"  ;; Code section with 2 empty functions
   436    )
   437    "function and code section have inconsistent lengths"
   438  )
   439  
   440  ;; Function section has zero count, and code section is absent.
   441  (module binary
   442    "\00asm" "\01\00\00\00"
   443    "\03\01\00"  ;; Function section with 0 functions
   444  )
   445  
   446  ;; Code section has zero count, and function section is absent.
   447  (module binary
   448    "\00asm" "\01\00\00\00"
   449    "\0a\01\00"  ;; Code section with 0 functions
   450  )
   451  
   452  ;; Fewer passive segments than datacount
   453  (assert_malformed
   454    (module binary
   455      "\00asm" "\01\00\00\00"
   456      "\0c\01\03"                   ;; Datacount section with value "3"
   457      "\0b\05\02"                   ;; Data section with two entries
   458      "\01\00"                      ;; Passive data section
   459      "\01\00")                     ;; Passive data section
   460    "data count and data section have inconsistent lengths")
   461  
   462  ;; More passive segments than datacount
   463  (assert_malformed
   464    (module binary
   465      "\00asm" "\01\00\00\00"
   466      "\0c\01\01"                   ;; Datacount section with value "1"
   467      "\0b\05\02"                   ;; Data section with two entries
   468      "\01\00"                      ;; Passive data section
   469      "\01\00")                     ;; Passive data section
   470    "data count and data section have inconsistent lengths")
   471  
   472  ;; memory.init requires a datacount section
   473  (assert_malformed
   474    (module binary
   475      "\00asm" "\01\00\00\00"
   476  
   477      "\01\04\01\60\00\00"       ;; Type section
   478      "\03\02\01\00"             ;; Function section
   479      "\05\03\01\00\00"          ;; Memory section
   480      "\0a\0e\01"                ;; Code section
   481  
   482      ;; function 0
   483      "\0c\00"
   484      "\41\00"                   ;; zero args
   485      "\41\00"
   486      "\41\00"
   487      "\fc\08\00\00"             ;; memory.init
   488      "\0b"
   489  
   490      "\0b\03\01\01\00"          ;; Data section
   491    )                            ;; end
   492    "data count section required")
   493  
   494  ;; data.drop requires a datacount section
   495  (assert_malformed
   496    (module binary
   497      "\00asm" "\01\00\00\00"
   498  
   499      "\01\04\01\60\00\00"       ;; Type section
   500      "\03\02\01\00"             ;; Function section
   501      "\05\03\01\00\00"          ;; Memory section
   502      "\0a\07\01"                ;; Code section
   503  
   504      ;; function 0
   505      "\05\00"
   506      "\fc\09\00"                ;; data.drop
   507      "\0b"
   508  
   509      "\0b\03\01\01\00"          ;; Data section
   510    )                            ;; end
   511    "data count section required")
   512  
   513  ;; passive element segment containing illegal opcode
   514  (assert_malformed
   515    (module binary
   516      "\00asm" "\01\00\00\00"
   517  
   518      "\01\04\01\60\00\00"       ;; Type section
   519  
   520      "\03\02\01\00"             ;; Function section
   521  
   522      "\04\04\01"                ;; Table section with 1 entry
   523      "\70\00\00"                ;; no max, minimum 0, funcref
   524  
   525      "\05\03\01\00\00"          ;; Memory section
   526  
   527      "\09\07\01"                ;; Element section with one segment
   528      "\05\70"                   ;; Passive, funcref
   529      "\01"                      ;; 1 element
   530      "\f3\00\0b"                ;; bad opcode, index 0, end
   531  
   532      "\0a\04\01"                ;; Code section
   533  
   534      ;; function 0
   535      "\02\00"
   536      "\0b")                     ;; end
   537    "illegal opcode")
   538  
   539  ;; passive element segment containing type other than funcref
   540  (assert_malformed
   541    (module binary
   542      "\00asm" "\01\00\00\00"
   543  
   544      "\01\04\01\60\00\00"       ;; Type section
   545  
   546      "\03\02\01\00"             ;; Function section
   547  
   548      "\04\04\01"                ;; Table section with 1 entry
   549      "\70\00\00"                ;; no max, minimum 0, funcref
   550  
   551      "\05\03\01\00\00"          ;; Memory section
   552  
   553      "\09\07\01"                ;; Element section with one segment
   554      "\05\7f"                   ;; Passive, i32
   555      "\01"                      ;; 1 element
   556      "\d2\00\0b"                ;; ref.func, index 0, end
   557  
   558      "\0a\04\01"                ;; Code section
   559  
   560      ;; function 0
   561      "\02\00"
   562      "\0b")                     ;; end
   563    "malformed reference type")
   564  
   565  ;; passive element segment containing opcode ref.func
   566  (module binary
   567    "\00asm" "\01\00\00\00"
   568  
   569    "\01\04\01\60\00\00"       ;; Type section
   570  
   571    "\03\02\01\00"             ;; Function section
   572  
   573    "\04\04\01"                ;; Table section with 1 entry
   574    "\70\00\00"                ;; no max, minimum 0, funcref
   575  
   576    "\05\03\01\00\00"          ;; Memory section
   577  
   578    "\09\07\01"                ;; Element section with one segment
   579    "\05\70"                   ;; Passive, funcref
   580    "\01"                      ;; 1 element
   581    "\d2\00\0b"                ;; ref.func, index 0, end
   582  
   583    "\0a\04\01"                ;; Code section
   584  
   585    ;; function 0
   586    "\02\00"
   587    "\0b")                     ;; end
   588  
   589  ;; passive element segment containing opcode ref.null
   590  (module binary
   591    "\00asm" "\01\00\00\00"
   592  
   593    "\01\04\01\60\00\00"       ;; Type section
   594  
   595    "\03\02\01\00"             ;; Function section
   596  
   597    "\04\04\01"                ;; Table section with 1 entry
   598    "\70\00\00"                ;; no max, minimum 0, funcref
   599  
   600    "\05\03\01\00\00"          ;; Memory section
   601  
   602    "\09\07\01"                ;; Element section with one segment
   603    "\05\70"                   ;; Passive, funcref
   604    "\01"                      ;; 1 element
   605    "\d0\70\0b"                ;; ref.null, end
   606  
   607    "\0a\04\01"                ;; Code section
   608  
   609    ;; function 0
   610    "\02\00"
   611    "\0b")                     ;; end
   612  
   613  
   614  ;; Type count can be zero
   615  (module binary
   616    "\00asm" "\01\00\00\00"
   617    "\01\01\00"                               ;; type count can be zero
   618  )
   619  
   620  ;; 2 type declared, 1 given
   621  (assert_malformed
   622    (module binary
   623      "\00asm" "\01\00\00\00"
   624      "\01\07\02"                             ;; type section with inconsistent count (2 declared, 1 given)
   625      "\60\00\00"                             ;; 1st type
   626      ;; "\60\00\00"                          ;; 2nd type (missed)
   627    )
   628    "length out of bounds"
   629  )
   630  
   631  ;; 1 type declared, 2 given
   632  (assert_malformed
   633    (module binary
   634      "\00asm" "\01\00\00\00"
   635      "\01\07\01"                             ;; type section with inconsistent count (1 declared, 2 given)
   636      "\60\00\00"                             ;; 1st type
   637      "\60\00\00"                             ;; 2nd type (redundant)
   638    )
   639    "section size mismatch"
   640  )
   641  
   642  ;; Import count can be zero
   643  (module binary
   644      "\00asm" "\01\00\00\00"
   645      "\01\05\01"                             ;; type section
   646      "\60\01\7f\00"                          ;; type 0
   647      "\02\01\00"                             ;; import count can be zero
   648  )
   649  
   650  ;; Malformed import kind
   651  (assert_malformed
   652    (module binary
   653        "\00asm" "\01\00\00\00"
   654        "\02\04\01"                           ;; import section with single entry
   655        "\00"                                 ;; string length 0
   656        "\00"                                 ;; string length 0
   657        "\04"                                 ;; malformed import kind
   658    )
   659    "malformed import kind"
   660  )
   661  (assert_malformed
   662    (module binary
   663        "\00asm" "\01\00\00\00"
   664        "\02\05\01"                           ;; import section with single entry
   665        "\00"                                 ;; string length 0
   666        "\00"                                 ;; string length 0
   667        "\04"                                 ;; malformed import kind
   668        "\00"                                 ;; dummy byte
   669    )
   670    "malformed import kind"
   671  )
   672  (assert_malformed
   673    (module binary
   674        "\00asm" "\01\00\00\00"
   675        "\02\04\01"                           ;; import section with single entry
   676        "\00"                                 ;; string length 0
   677        "\00"                                 ;; string length 0
   678        "\05"                                 ;; malformed import kind
   679    )
   680    "malformed import kind"
   681  )
   682  (assert_malformed
   683    (module binary
   684        "\00asm" "\01\00\00\00"
   685        "\02\05\01"                           ;; import section with single entry
   686        "\00"                                 ;; string length 0
   687        "\00"                                 ;; string length 0
   688        "\05"                                 ;; malformed import kind
   689        "\00"                                 ;; dummy byte
   690    )
   691    "malformed import kind"
   692  )
   693  (assert_malformed
   694    (module binary
   695        "\00asm" "\01\00\00\00"
   696        "\02\04\01"                           ;; import section with single entry
   697        "\00"                                 ;; string length 0
   698        "\00"                                 ;; string length 0
   699        "\80"                                 ;; malformed import kind
   700    )
   701    "malformed import kind"
   702  )
   703  (assert_malformed
   704    (module binary
   705        "\00asm" "\01\00\00\00"
   706        "\02\05\01"                           ;; import section with single entry
   707        "\00"                                 ;; string length 0
   708        "\00"                                 ;; string length 0
   709        "\80"                                 ;; malformed import kind
   710        "\00"                                 ;; dummy byte
   711    )
   712    "malformed import kind"
   713  )
   714  
   715  ;; 2 import declared, 1 given
   716  (assert_malformed
   717    (module binary
   718        "\00asm" "\01\00\00\00"
   719        "\01\05\01"                           ;; type section
   720        "\60\01\7f\00"                        ;; type 0
   721        "\02\16\02"                           ;; import section with inconsistent count (2 declared, 1 given)
   722        ;; 1st import
   723        "\08"                                 ;; string length
   724        "\73\70\65\63\74\65\73\74"            ;; spectest
   725        "\09"                                 ;; string length
   726        "\70\72\69\6e\74\5f\69\33\32"         ;; print_i32
   727        "\00\00"                              ;; import kind, import signature index
   728        ;; 2nd import
   729        ;; (missed)
   730    )
   731    "unexpected end of section or function"
   732  )
   733  
   734  ;; 1 import declared, 2 given
   735  (assert_malformed
   736    (module binary
   737        "\00asm" "\01\00\00\00"
   738        "\01\09\02"                           ;; type section
   739        "\60\01\7f\00"                        ;; type 0
   740        "\60\01\7d\00"                        ;; type 1
   741        "\02\2b\01"                           ;; import section with inconsistent count (1 declared, 2 given)
   742        ;; 1st import
   743        "\08"                                 ;; string length
   744        "\73\70\65\63\74\65\73\74"            ;; spectest
   745        "\09"                                 ;; string length
   746        "\70\72\69\6e\74\5f\69\33\32"         ;; print_i32
   747        "\00\00"                              ;; import kind, import signature index
   748        ;; 2nd import
   749        ;; (redundant)
   750        "\08"                                 ;; string length
   751        "\73\70\65\63\74\65\73\74"            ;; spectest
   752        "\09"                                 ;; string length
   753        "\70\72\69\6e\74\5f\66\33\32"         ;; print_f32
   754        "\00\01"                              ;; import kind, import signature index
   755    )
   756    "section size mismatch"
   757  )
   758  
   759  ;; Table count can be zero
   760  (module binary
   761      "\00asm" "\01\00\00\00"
   762      "\04\01\00"                             ;; table count can be zero
   763  )
   764  
   765  ;; 1 table declared, 0 given
   766  (assert_malformed
   767    (module binary
   768        "\00asm" "\01\00\00\00"
   769        "\04\01\01"                           ;; table section with inconsistent count (1 declared, 0 given)
   770        ;; "\70\01\00\00"                     ;; table entity
   771    )
   772    "unexpected end of section or function"
   773  )
   774  
   775  ;; Malformed table limits flag
   776  (assert_malformed
   777    (module binary
   778        "\00asm" "\01\00\00\00"
   779        "\04\03\01"                           ;; table section with one entry
   780        "\70"                                 ;; anyfunc
   781        "\02"                                 ;; malformed table limits flag
   782    )
   783    "integer too large"
   784  )
   785  (assert_malformed
   786    (module binary
   787        "\00asm" "\01\00\00\00"
   788        "\04\04\01"                           ;; table section with one entry
   789        "\70"                                 ;; anyfunc
   790        "\02"                                 ;; malformed table limits flag
   791        "\00"                                 ;; dummy byte
   792    )
   793    "integer too large"
   794  )
   795  (assert_malformed
   796    (module binary
   797        "\00asm" "\01\00\00\00"
   798        "\04\06\01"                           ;; table section with one entry
   799        "\70"                                 ;; anyfunc
   800        "\81\00"                              ;; malformed table limits flag as LEB128
   801        "\00\00"                              ;; dummy bytes
   802    )
   803    "integer representation too long"
   804  )
   805  
   806  ;; Memory count can be zero
   807  (module binary
   808      "\00asm" "\01\00\00\00"
   809      "\05\01\00"                             ;; memory count can be zero
   810  )
   811  
   812  ;; 1 memory declared, 0 given
   813  (assert_malformed
   814    (module binary
   815        "\00asm" "\01\00\00\00"
   816        "\05\01\01"                           ;; memory section with inconsistent count (1 declared, 0 given)
   817        ;; "\00\00"                           ;; memory 0 (missed)
   818    )
   819    "unexpected end of section or function"
   820  )
   821  
   822  ;; Malformed memory limits flag
   823  (assert_malformed
   824    (module binary
   825        "\00asm" "\01\00\00\00"
   826        "\05\02\01"                           ;; memory section with one entry
   827        "\02"                                 ;; malformed memory limits flag
   828    )
   829    "integer too large"
   830  )
   831  (assert_malformed
   832    (module binary
   833        "\00asm" "\01\00\00\00"
   834        "\05\03\01"                           ;; memory section with one entry
   835        "\02"                                 ;; malformed memory limits flag
   836        "\00"                                 ;; dummy byte
   837    )
   838    "integer too large"
   839  )
   840  (assert_malformed
   841    (module binary
   842        "\00asm" "\01\00\00\00"
   843        "\05\05\01"                           ;; memory section with one entry
   844        "\81\00"                              ;; malformed memory limits flag as LEB128
   845        "\00\00"                              ;; dummy bytes
   846    )
   847    "integer representation too long"
   848  )
   849  (assert_malformed
   850    (module binary
   851        "\00asm" "\01\00\00\00"
   852        "\05\05\01"                           ;; memory section with one entry
   853        "\81\01"                              ;; malformed memory limits flag as LEB128
   854        "\00\00"                              ;; dummy bytes
   855    )
   856    "integer representation too long"
   857  )
   858  
   859  ;; Global count can be zero
   860  (module binary
   861    "\00asm" "\01\00\00\00"
   862    "\06\01\00"                               ;; global count can be zero
   863  )
   864  
   865  ;; 2 global declared, 1 given
   866  (assert_malformed
   867    (module binary
   868      "\00asm" "\01\00\00\00"
   869      "\06\06\02"                             ;; global section with inconsistent count (2 declared, 1 given)
   870      "\7f\00\41\00\0b"                       ;; global 0
   871      ;; "\7f\00\41\00\0b"                    ;; global 1 (missed)
   872    )
   873    "unexpected end of section or function"
   874  )
   875  
   876  ;; 1 global declared, 2 given
   877  (assert_malformed
   878    (module binary
   879      "\00asm" "\01\00\00\00"
   880      "\06\0b\01"                             ;; global section with inconsistent count (1 declared, 2 given)
   881      "\7f\00\41\00\0b"                       ;; global 0
   882      "\7f\00\41\00\0b"                       ;; global 1 (redundant)
   883    )
   884    "section size mismatch"
   885  )
   886  
   887  ;; Export count can be 0
   888  (module binary
   889    "\00asm" "\01\00\00\00"
   890    "\01\04\01"                               ;; type section
   891    "\60\00\00"                               ;; type 0
   892    "\03\03\02\00\00"                         ;; func section
   893    "\07\01\00"                               ;; export count can be zero
   894    "\0a\07\02"                               ;; code section
   895    "\02\00\0b"                               ;; function body 0
   896    "\02\00\0b"                               ;; function body 1
   897  )
   898  
   899  ;; 2 export declared, 1 given
   900  (assert_malformed
   901    (module binary
   902      "\00asm" "\01\00\00\00"
   903      "\01\04\01"                             ;; type section
   904      "\60\00\00"                             ;; type 0
   905      "\03\03\02\00\00"                       ;; func section
   906      "\07\06\02"                             ;; export section with inconsistent count (2 declared, 1 given)
   907      "\02"                                   ;; export 0
   908      "\66\31"                                ;; export name
   909      "\00\00"                                ;; export kind, export func index
   910      ;; "\02"                                ;; export 1 (missed)
   911      ;; "\66\32"                             ;; export name
   912      ;; "\00\01"                             ;; export kind, export func index
   913      "\0a\07\02"                             ;; code section
   914      "\02\00\0b"                             ;; function body 0
   915      "\02\00\0b"                             ;; function body 1
   916    )
   917    "length out of bounds"
   918  )
   919  
   920  ;; 1 export declared, 2 given
   921  (assert_malformed
   922    (module binary
   923      "\00asm" "\01\00\00\00"
   924      "\01\04\01"                             ;; type section
   925      "\60\00\00"                             ;; type 0
   926      "\03\03\02\00\00"                       ;; func section
   927      "\07\0b\01"                             ;; export section with inconsistent count (1 declared, 2 given)
   928      "\02"                                   ;; export 0
   929      "\66\31"                                ;; export name
   930      "\00\00"                                ;; export kind, export func index
   931      "\02"                                   ;; export 1 (redundant)
   932      "\66\32"                                ;; export name
   933      "\00\01"                                ;; export kind, export func index
   934      "\0a\07\02"                             ;; code section
   935      "\02\00\0b"                             ;; function body 0
   936      "\02\00\0b"                             ;; function body 1
   937    )
   938    "section size mismatch"
   939  )
   940  
   941  ;; elem segment count can be zero
   942  (module binary
   943    "\00asm" "\01\00\00\00"
   944    "\01\04\01"                               ;; type section
   945    "\60\00\00"                               ;; type 0
   946    "\03\02\01\00"                            ;; func section
   947    "\04\04\01"                               ;; table section
   948    "\70\00\01"                               ;; table 0
   949    "\09\01\00"                               ;; elem segment count can be zero
   950    "\0a\04\01"                               ;; code section
   951    "\02\00\0b"                               ;; function body
   952  )
   953  
   954  ;; 2 elem segment declared, 1 given
   955  (assert_malformed
   956    (module binary
   957      "\00asm" "\01\00\00\00"
   958      "\01\04\01"                             ;; type section
   959      "\60\00\00"                             ;; type 0
   960      "\03\02\01\00"                          ;; func section
   961      "\04\04\01"                             ;; table section
   962      "\70\00\01"                             ;; table 0
   963      "\09\07\02"                             ;; elem with inconsistent segment count (2 declared, 1 given)
   964      "\00\41\00\0b\01\00"                    ;; elem 0
   965      ;; "\00\41\00\0b\01\00"                 ;; elem 1 (missed)
   966    )
   967    "unexpected end"
   968  )
   969  
   970  ;; 2 elem segment declared, 1.5 given
   971  (assert_malformed
   972    (module binary
   973      "\00asm" "\01\00\00\00"
   974      "\01\04\01"                             ;; type section
   975      "\60\00\00"                             ;; type 0
   976      "\03\02\01\00"                          ;; func section
   977      "\04\04\01"                             ;; table section
   978      "\70\00\01"                             ;; table 0
   979      "\09\0a\02"                             ;; elem with inconsistent segment count (2 declared, 1 given)
   980      "\00\41\00\0b\01\00"                    ;; elem 0
   981      "\00\41\00"                             ;; elem 1 (partial)
   982      ;; "\0b\01\00"                          ;; elem 1 (missing part)
   983    )
   984    "unexpected end"
   985  )
   986  
   987  ;; 1 elem segment declared, 2 given
   988  (assert_malformed
   989    (module binary
   990      "\00asm" "\01\00\00\00"
   991      "\01\04\01"                             ;; type section
   992      "\60\00\00"                             ;; type 0
   993      "\03\02\01\00"                          ;; func section
   994      "\04\04\01"                             ;; table section
   995      "\70\00\01"                             ;; table 0
   996      "\09\0d\01"                             ;; elem with inconsistent segment count (1 declared, 2 given)
   997      "\00\41\00\0b\01\00"                    ;; elem 0
   998      "\00\41\00\0b\01\00"                    ;; elem 1 (redundant)
   999      "\0a\04\01"                             ;; code section
  1000      "\02\00\0b"                             ;; function body
  1001    )
  1002    "section size mismatch"
  1003  )
  1004  
  1005  ;; data segment count can be zero
  1006  (module binary
  1007    "\00asm" "\01\00\00\00"
  1008    "\05\03\01"                               ;; memory section
  1009    "\00\01"                                  ;; memory 0
  1010    "\0b\01\00"                               ;; data segment count can be zero
  1011  )
  1012  
  1013  ;; 2 data segment declared, 1 given
  1014  (assert_malformed
  1015    (module binary
  1016      "\00asm" "\01\00\00\00"
  1017      "\05\03\01"                             ;; memory section
  1018      "\00\01"                                ;; memory 0
  1019      "\0b\07\02"                             ;; data with inconsistent segment count (2 declared, 1 given)
  1020      "\00\41\00\0b\01\61"                    ;; data 0
  1021      ;; "\00\41\01\0b\01\62"                 ;; data 1 (missed)
  1022    )
  1023    "unexpected end of section or function"
  1024  )
  1025  
  1026  ;; 1 data segment declared, 2 given
  1027  (assert_malformed
  1028    (module binary
  1029      "\00asm" "\01\00\00\00"
  1030      "\05\03\01"                             ;; memory section
  1031      "\00\01"                                ;; memory 0
  1032      "\0b\0d\01"                             ;; data with inconsistent segment count (1 declared, 2 given)
  1033      "\00\41\00\0b\01\61"                    ;; data 0
  1034      "\00\41\01\0b\01\62"                    ;; data 1 (redundant)
  1035    )
  1036    "section size mismatch"
  1037  )
  1038  
  1039  ;; data segment has 7 bytes declared, but 6 bytes given
  1040  (assert_malformed
  1041    (module binary
  1042      "\00asm" "\01\00\00\00"
  1043      "\05\03\01"                             ;; memory section
  1044      "\00\01"                                ;; memory 0
  1045      "\0b\0c\01"                             ;; data section
  1046      "\00\41\03\0b"                          ;; data segment 0
  1047      "\07"                                   ;; data segment size with inconsistent lengths (7 declared, 6 given)
  1048      "\61\62\63\64\65\66"                    ;; 6 bytes given
  1049    )
  1050    "unexpected end of section or function"
  1051  )
  1052  
  1053  ;; data segment has 5 bytes declared, but 6 bytes given
  1054  (assert_malformed
  1055    (module binary
  1056      "\00asm" "\01\00\00\00"
  1057      "\05\03\01"                             ;; memory section
  1058      "\00\01"                                ;; memory 0
  1059      "\0b\0c\01"                             ;; data section
  1060      "\00\41\00\0b"                          ;; data segment 0
  1061      "\05"                                   ;; data segment size with inconsistent lengths (5 declared, 6 given)
  1062      "\61\62\63\64\65\66"                    ;; 6 bytes given
  1063    )
  1064    "section size mismatch"
  1065  )
  1066  
  1067  ;; br_table target count can be zero
  1068  (module binary
  1069    "\00asm" "\01\00\00\00"
  1070    "\01\04\01"                               ;; type section
  1071    "\60\00\00"                               ;; type 0
  1072    "\03\02\01\00"                            ;; func section
  1073    "\0a\11\01"                               ;; code section
  1074    "\0f\00"                                  ;; func 0
  1075    "\02\40"                                  ;; block 0
  1076    "\41\01"                                  ;; condition of if 0
  1077    "\04\40"                                  ;; if 0
  1078    "\41\01"                                  ;; index of br_table element
  1079    "\0e\00"                                  ;; br_table target count can be zero
  1080    "\02"                                     ;; break depth for default
  1081    "\0b\0b\0b"                               ;; end
  1082  )
  1083  
  1084  ;; 1 br_table target declared, 2 given
  1085  (assert_malformed
  1086    (module binary
  1087      "\00asm" "\01\00\00\00"
  1088      "\01\04\01"                             ;; type section
  1089      "\60\00\00"                             ;; type 0
  1090      "\03\02\01\00"                          ;; func section
  1091      "\0a\13\01"                             ;; code section
  1092      "\11\00"                                ;; func 0
  1093      "\02\40"                                ;; block 0
  1094      "\41\01"                                ;; condition of if 0
  1095      "\04\40"                                ;; if 0
  1096      "\41\01"                                ;; index of br_table element
  1097      "\0e\01"                                ;; br_table with inconsistent target count (1 declared, 2 given)
  1098      "\00"                                   ;; break depth 0
  1099      "\01"                                   ;; break depth 1
  1100      "\02"                                   ;; break depth for default
  1101      "\0b\0b\0b"                             ;; end
  1102    )
  1103    "unexpected end"
  1104  )
  1105  
  1106  ;; Start section
  1107  (module binary
  1108    "\00asm" "\01\00\00\00"
  1109    "\01\04\01\60\00\00"       ;; Type section
  1110    "\03\02\01\00"             ;; Function section
  1111    "\08\01\00"                ;; Start section: function 0
  1112  
  1113    "\0a\04\01"                ;; Code section
  1114    ;; function 0
  1115    "\02\00"
  1116    "\0b"                      ;; end
  1117  )
  1118  
  1119  ;; Multiple start sections
  1120  (assert_malformed
  1121    (module binary
  1122      "\00asm" "\01\00\00\00"
  1123      "\01\04\01\60\00\00"       ;; Type section
  1124      "\03\02\01\00"             ;; Function section
  1125      "\08\01\00"                ;; Start section: function 0
  1126      "\08\01\00"                ;; Start section: function 0
  1127  
  1128      "\0a\04\01"                ;; Code section
  1129      ;; function 0
  1130      "\02\00"
  1131      "\0b"                      ;; end
  1132    )
  1133    "unexpected content after last section"
  1134  )