OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "test/unittests/test-utils.h" | 5 #include "test/unittests/test-utils.h" |
6 | 6 |
7 #include "src/wasm/module-decoder.h" | 7 #include "src/wasm/module-decoder.h" |
8 #include "src/wasm/wasm-opcodes.h" | 8 #include "src/wasm/wasm-opcodes.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
11 namespace internal { | 11 namespace internal { |
12 namespace wasm { | 12 namespace wasm { |
13 | 13 |
| 14 #define VOID_VOID_SIG 0, kLocalVoid |
| 15 #define INT_INT_SIG 1, kLocalI32, kLocalI32 |
| 16 #define NOP_FUNCTION(sig_index) \ |
| 17 0, static_cast<byte>(sig_index), 0, 1, 0, kExprNop |
| 18 #define EMPTY_FUNCTION(sig_index) 0, static_cast<byte>(sig_index), 0, 0, 0 |
| 19 |
| 20 #define U32(v) \ |
| 21 static_cast<byte>(v), static_cast<byte>(v >> 8), static_cast<byte>(v >> 16), \ |
| 22 static_cast<byte>(v >> 24) |
| 23 #define U16(v) static_cast<byte>(v), static_cast<byte>(v >> 8) |
| 24 #define U8(v) static_cast<byte>(v) |
| 25 |
| 26 #define SIG_INDEX(v) U16(v) |
| 27 #define FUNC_INDEX(v) U16(v) |
| 28 #define NAME_OFFSET(v) U32(v) |
| 29 |
14 class WasmModuleVerifyTest : public TestWithZone { | 30 class WasmModuleVerifyTest : public TestWithZone { |
15 public: | 31 public: |
16 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) { | 32 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) { |
17 return DecodeWasmModule(nullptr, zone(), module_start, module_end, false, | 33 return DecodeWasmModule(nullptr, zone(), module_start, module_end, false, |
18 false); | 34 false); |
19 } | 35 } |
20 }; | 36 }; |
21 | 37 |
22 | 38 |
23 #define EXPECT_VERIFIES(data) \ | 39 #define EXPECT_VERIFIES(data) \ |
(...skipping 14 matching lines...) Expand all Loading... |
38 | 54 |
39 struct LocalTypePair { | 55 struct LocalTypePair { |
40 uint8_t code; | 56 uint8_t code; |
41 LocalType type; | 57 LocalType type; |
42 } kLocalTypes[] = {{kLocalI32, kAstI32}, | 58 } kLocalTypes[] = {{kLocalI32, kAstI32}, |
43 {kLocalI64, kAstI64}, | 59 {kLocalI64, kAstI64}, |
44 {kLocalF32, kAstF32}, | 60 {kLocalF32, kAstF32}, |
45 {kLocalF64, kAstF64}}; | 61 {kLocalF64, kAstF64}}; |
46 | 62 |
47 | 63 |
48 // TODO(titzer): use these macros everywhere below. | |
49 #define U32_LE(v) \ | |
50 static_cast<byte>(v), static_cast<byte>((v) >> 8), \ | |
51 static_cast<byte>((v) >> 16), static_cast<byte>((v) >> 24) | |
52 | |
53 | |
54 #define U16_LE(v) static_cast<byte>(v), static_cast<byte>((v) >> 8) | |
55 | |
56 | |
57 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { | 64 TEST_F(WasmModuleVerifyTest, DecodeEmpty) { |
58 static const byte data[1]{kDeclEnd}; | 65 static const byte data[1]{kDeclEnd}; |
59 { | 66 { |
60 ModuleResult result = DecodeModule(data, data); | 67 ModuleResult result = DecodeModule(data, data); |
61 EXPECT_TRUE(result.ok()); | 68 EXPECT_TRUE(result.ok()); |
62 if (result.val) delete result.val; | 69 if (result.val) delete result.val; |
63 } | 70 } |
64 { | 71 { |
65 ModuleResult result = DecodeModule(data, data + 1); | 72 ModuleResult result = DecodeModule(data, data + 1); |
66 EXPECT_TRUE(result.ok()); | 73 EXPECT_TRUE(result.ok()); |
67 if (result.val) delete result.val; | 74 if (result.val) delete result.val; |
68 } | 75 } |
69 } | 76 } |
70 | 77 |
71 | 78 |
72 TEST_F(WasmModuleVerifyTest, OneGlobal) { | 79 TEST_F(WasmModuleVerifyTest, OneGlobal) { |
73 static const byte data[] = { | 80 static const byte data[] = { |
74 kDeclGlobals, | 81 kDeclGlobals, |
75 1, | 82 1, |
76 0, | 83 NAME_OFFSET(0), |
77 0, | |
78 0, | |
79 0, // name offset | |
80 kMemI32, // memory type | 84 kMemI32, // memory type |
81 0, // exported | 85 0, // exported |
82 }; | 86 }; |
83 | 87 |
84 { | 88 { |
85 // Should decode to exactly one global. | 89 // Should decode to exactly one global. |
86 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 90 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
87 EXPECT_TRUE(result.ok()); | 91 EXPECT_TRUE(result.ok()); |
88 EXPECT_EQ(1, result.val->globals->size()); | 92 EXPECT_EQ(1, result.val->globals->size()); |
89 EXPECT_EQ(0, result.val->functions->size()); | 93 EXPECT_EQ(0, result.val->functions->size()); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 } else { | 132 } else { |
129 buffer.push_back(static_cast<byte>(out)); | 133 buffer.push_back(static_cast<byte>(out)); |
130 break; | 134 break; |
131 } | 135 } |
132 } | 136 } |
133 } | 137 } |
134 | 138 |
135 | 139 |
136 TEST_F(WasmModuleVerifyTest, NGlobals) { | 140 TEST_F(WasmModuleVerifyTest, NGlobals) { |
137 static const byte data[] = { | 141 static const byte data[] = { |
138 0, 0, 0, 0, // name offset | 142 NAME_OFFSET(0), // name offset |
139 kMemI32, // memory type | 143 kMemI32, // memory type |
140 0, // exported | 144 0, // exported |
141 }; | 145 }; |
142 for (uint32_t i = 0; i < 1000000; i = i * 7 + 1) { | 146 for (uint32_t i = 0; i < 1000000; i = i * 7 + 1) { |
143 std::vector<byte> buffer; | 147 std::vector<byte> buffer; |
144 buffer.push_back(kDeclGlobals); | 148 buffer.push_back(kDeclGlobals); |
145 AppendUint32v(buffer, i); | 149 AppendUint32v(buffer, i); |
146 for (uint32_t j = 0; j < i; j++) { | 150 for (uint32_t j = 0; j < i; j++) { |
147 buffer.insert(buffer.end(), data, data + arraysize(data)); | 151 buffer.insert(buffer.end(), data, data + arraysize(data)); |
148 } | 152 } |
149 | 153 |
150 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); | 154 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size()); |
151 EXPECT_TRUE(result.ok()); | 155 EXPECT_TRUE(result.ok()); |
152 if (result.val) delete result.val; | 156 if (result.val) delete result.val; |
153 } | 157 } |
154 } | 158 } |
155 | 159 |
156 | 160 |
157 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) { | 161 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) { |
158 static const byte data[] = { | 162 static const byte data[] = { |
159 kDeclGlobals, | 163 kDeclGlobals, |
160 1, // declare one global | 164 1, // declare one global |
161 0, | 165 0, |
162 3, | 166 3, |
163 0, | 167 NAME_OFFSET(0), // name offset |
164 0, // name offset | 168 kMemI32, // memory type |
165 kMemI32, // memory type | 169 0, // exported |
166 0, // exported | |
167 }; | 170 }; |
168 | 171 |
169 EXPECT_FAILURE(data); | 172 EXPECT_FAILURE(data); |
170 } | 173 } |
171 | 174 |
172 | 175 |
173 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) { | 176 TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) { |
174 static const byte data[] = { | 177 static const byte data[] = { |
175 kDeclGlobals, | 178 kDeclGlobals, |
176 1, // declare one global | 179 1, // declare one global |
177 0, | 180 NAME_OFFSET(0), // name offset |
178 0, | 181 33, // memory type |
179 0, | 182 0, // exported |
180 0, // name offset | |
181 33, // memory type | |
182 0, // exported | |
183 }; | 183 }; |
184 | 184 |
185 EXPECT_FAILURE(data); | 185 EXPECT_FAILURE(data); |
186 } | 186 } |
187 | 187 |
188 | 188 |
189 TEST_F(WasmModuleVerifyTest, TwoGlobals) { | 189 TEST_F(WasmModuleVerifyTest, TwoGlobals) { |
190 static const byte data[] = { | 190 static const byte data[] = { |
191 kDeclGlobals, | 191 kDeclGlobals, |
192 2, | 192 2, |
193 0, | 193 NAME_OFFSET(0), // #0: name offset |
194 0, | 194 kMemF32, // memory type |
195 0, | 195 0, // exported |
196 0, // #0: name offset | 196 NAME_OFFSET(0), // #1: name offset |
197 kMemF32, // memory type | 197 kMemF64, // memory type |
198 0, // exported | 198 1, // exported |
199 0, | |
200 0, | |
201 0, | |
202 0, // #1: name offset | |
203 kMemF64, // memory type | |
204 1, // exported | |
205 }; | 199 }; |
206 | 200 |
207 { | 201 { |
208 // Should decode to exactly two globals. | 202 // Should decode to exactly two globals. |
209 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 203 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
210 EXPECT_TRUE(result.ok()); | 204 EXPECT_TRUE(result.ok()); |
211 EXPECT_EQ(2, result.val->globals->size()); | 205 EXPECT_EQ(2, result.val->globals->size()); |
212 EXPECT_EQ(0, result.val->functions->size()); | 206 EXPECT_EQ(0, result.val->functions->size()); |
213 EXPECT_EQ(0, result.val->data_segments->size()); | 207 EXPECT_EQ(0, result.val->data_segments->size()); |
214 | 208 |
(...skipping 16 matching lines...) Expand all Loading... |
231 for (size_t size = 1; size < arraysize(data); size++) { | 225 for (size_t size = 1; size < arraysize(data); size++) { |
232 // Should fall off end of module bytes. | 226 // Should fall off end of module bytes. |
233 ModuleResult result = DecodeModule(data, data + size); | 227 ModuleResult result = DecodeModule(data, data + size); |
234 EXPECT_FALSE(result.ok()); | 228 EXPECT_FALSE(result.ok()); |
235 if (result.val) delete result.val; | 229 if (result.val) delete result.val; |
236 } | 230 } |
237 } | 231 } |
238 | 232 |
239 | 233 |
240 TEST_F(WasmModuleVerifyTest, OneSignature) { | 234 TEST_F(WasmModuleVerifyTest, OneSignature) { |
241 static const byte data[] = { | 235 { |
242 kDeclSignatures, 1, 0, kLocalVoid // void -> void | 236 static const byte data[] = {kDeclSignatures, 1, VOID_VOID_SIG}; |
243 }; | 237 EXPECT_VERIFIES(data); |
244 EXPECT_VERIFIES(data); | 238 } |
| 239 |
| 240 { |
| 241 static const byte data[] = {kDeclSignatures, 1, INT_INT_SIG}; |
| 242 EXPECT_VERIFIES(data); |
| 243 } |
245 } | 244 } |
246 | 245 |
247 | 246 |
248 TEST_F(WasmModuleVerifyTest, MultipleSignatures) { | 247 TEST_F(WasmModuleVerifyTest, MultipleSignatures) { |
249 static const byte data[] = { | 248 static const byte data[] = { |
250 kDeclSignatures, | 249 kDeclSignatures, |
251 3, | 250 3, |
252 0, | 251 0, |
253 kLocalVoid, // void -> void | 252 kLocalVoid, // void -> void |
254 1, | 253 1, |
(...skipping 25 matching lines...) Expand all Loading... |
280 EXPECT_FALSE(result.ok()); | 279 EXPECT_FALSE(result.ok()); |
281 if (result.val) delete result.val; | 280 if (result.val) delete result.val; |
282 } | 281 } |
283 } | 282 } |
284 | 283 |
285 | 284 |
286 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) { | 285 TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) { |
287 static const byte data[] = { | 286 static const byte data[] = { |
288 kDeclFunctions, 1, | 287 kDeclFunctions, 1, |
289 // func#0 ------------------------------------------------------ | 288 // func#0 ------------------------------------------------------ |
290 0, 0, // signature index | 289 SIG_INDEX(0), // signature index |
291 0, 0, 0, 0, // name offset | 290 NAME_OFFSET(0), // name offset |
292 0, 0, 0, 0, // code start offset | 291 U32(0), // code start offset |
293 0, 0, 0, 0, // code end offset | 292 U32(0), // code end offset |
294 1, 2, // local int32 count | 293 U16(899), // local int32 count |
295 3, 4, // local int64 count | 294 U16(799), // local int64 count |
296 5, 6, // local float32 count | 295 U16(699), // local float32 count |
297 7, 8, // local float64 count | 296 U16(599), // local float64 count |
298 0, // exported | 297 0, // exported |
299 1 // external | 298 1 // external |
300 }; | 299 }; |
301 | 300 |
302 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 301 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
303 EXPECT_FALSE(result.ok()); | 302 EXPECT_FALSE(result.ok()); |
304 if (result.val) delete result.val; | 303 if (result.val) delete result.val; |
305 } | 304 } |
306 | 305 |
307 | 306 |
308 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { | 307 TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) { |
309 const int kCodeStartOffset = 23; | 308 const int kCodeStartOffset = 23; |
310 const int kCodeEndOffset = kCodeStartOffset + 1; | 309 const int kCodeEndOffset = kCodeStartOffset + 1; |
311 | 310 |
312 static const byte data[] = { | 311 static const byte data[] = { |
313 kDeclSignatures, 1, | 312 kDeclSignatures, 1, |
314 // sig#0 ------------------------------------------------------- | 313 // sig#0 ------------------------------------------------------- |
315 0, 0, // void -> void | 314 VOID_VOID_SIG, |
316 // func#0 ------------------------------------------------------ | 315 // func#0 ------------------------------------------------------ |
317 kDeclFunctions, 1, | 316 kDeclFunctions, 1, |
318 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, 0, | 317 kDeclFunctionLocals | kDeclFunctionExport | kDeclFunctionName, 0, |
319 0, // signature index | 318 0, // signature index |
320 9, 0, 0, 0, // name offset | 319 NAME_OFFSET(9), // name offset |
321 11, 2, // local int32 count | 320 U16(1466), // local int32 count |
322 13, 4, // local int64 count | 321 U16(1355), // local int64 count |
323 15, 6, // local float32 count | 322 U16(1244), // local float32 count |
324 17, 8, // local float64 count | 323 U16(1133), // local float64 count |
325 1, 0, // size | 324 1, 0, // size |
326 kExprNop, | 325 kExprNop, |
327 }; | 326 }; |
328 | 327 |
329 { | 328 { |
330 // Should decode to exactly one function. | 329 // Should decode to exactly one function. |
331 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 330 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
332 EXPECT_TRUE(result.ok()); | 331 EXPECT_TRUE(result.ok()); |
333 EXPECT_EQ(0, result.val->globals->size()); | 332 EXPECT_EQ(0, result.val->globals->size()); |
334 EXPECT_EQ(1, result.val->signatures->size()); | 333 EXPECT_EQ(1, result.val->signatures->size()); |
335 EXPECT_EQ(1, result.val->functions->size()); | 334 EXPECT_EQ(1, result.val->functions->size()); |
336 EXPECT_EQ(0, result.val->data_segments->size()); | 335 EXPECT_EQ(0, result.val->data_segments->size()); |
337 EXPECT_EQ(0, result.val->function_table->size()); | 336 EXPECT_EQ(0, result.val->function_table->size()); |
338 | 337 |
339 WasmFunction* function = &result.val->functions->back(); | 338 WasmFunction* function = &result.val->functions->back(); |
340 | 339 |
341 EXPECT_EQ(9, function->name_offset); | 340 EXPECT_EQ(9, function->name_offset); |
342 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); | 341 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); |
343 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); | 342 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); |
344 | 343 |
345 EXPECT_EQ(523, function->local_i32_count); | 344 EXPECT_EQ(1466, function->local_i32_count); |
346 EXPECT_EQ(1037, function->local_i64_count); | 345 EXPECT_EQ(1355, function->local_i64_count); |
347 EXPECT_EQ(1551, function->local_f32_count); | 346 EXPECT_EQ(1244, function->local_f32_count); |
348 EXPECT_EQ(2065, function->local_f64_count); | 347 EXPECT_EQ(1133, function->local_f64_count); |
349 | 348 |
350 EXPECT_TRUE(function->exported); | 349 EXPECT_TRUE(function->exported); |
351 EXPECT_FALSE(function->external); | 350 EXPECT_FALSE(function->external); |
352 | 351 |
353 if (result.val) delete result.val; | 352 if (result.val) delete result.val; |
354 } | 353 } |
355 | 354 |
356 for (size_t size = 5; size < arraysize(data); size++) { | 355 for (size_t size = 5; size < arraysize(data); size++) { |
357 // Should fall off end of module bytes. | 356 // Should fall off end of module bytes. |
358 ModuleResult result = DecodeModule(data, data + size); | 357 ModuleResult result = DecodeModule(data, data + size); |
359 EXPECT_FALSE(result.ok()); | 358 EXPECT_FALSE(result.ok()); |
360 if (result.val) delete result.val; | 359 if (result.val) delete result.val; |
361 } | 360 } |
362 } | 361 } |
363 | 362 |
364 | 363 |
365 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { | 364 TEST_F(WasmModuleVerifyTest, OneFunctionImported) { |
366 static const byte data[] = { | 365 static const byte data[] = { |
367 kDeclSignatures, 1, | 366 kDeclSignatures, 1, |
368 // sig#0 ------------------------------------------------------- | 367 // sig#0 ------------------------------------------------------- |
369 0, 0, // void -> void | 368 VOID_VOID_SIG, kDeclFunctions, 1, |
370 kDeclFunctions, 1, | |
371 // func#0 ------------------------------------------------------ | 369 // func#0 ------------------------------------------------------ |
372 kDeclFunctionImport, // no name, no locals, imported | 370 kDeclFunctionImport, // no name, no locals, imported |
373 0, 0, // signature index | 371 U16(0), |
374 }; | 372 }; |
375 | 373 |
376 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 374 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
377 EXPECT_TRUE(result.ok()); | 375 EXPECT_TRUE(result.ok()); |
378 EXPECT_EQ(1, result.val->functions->size()); | 376 EXPECT_EQ(1, result.val->functions->size()); |
379 WasmFunction* function = &result.val->functions->back(); | 377 WasmFunction* function = &result.val->functions->back(); |
380 | 378 |
381 EXPECT_EQ(0, function->name_offset); | 379 EXPECT_EQ(0, function->name_offset); |
382 EXPECT_EQ(0, function->code_start_offset); | 380 EXPECT_EQ(0, function->code_start_offset); |
383 EXPECT_EQ(0, function->code_end_offset); | 381 EXPECT_EQ(0, function->code_end_offset); |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 | 634 |
637 for (int source_offset = 0; source_offset < 5 + kDataSize; source_offset++) { | 635 for (int source_offset = 0; source_offset < 5 + kDataSize; source_offset++) { |
638 for (int source_size = -1; source_size < 5 + kDataSize; source_size += 3) { | 636 for (int source_size = -1; source_size < 5 + kDataSize; source_size += 3) { |
639 byte data[] = { | 637 byte data[] = { |
640 kDeclMemory, | 638 kDeclMemory, |
641 mem_size_log2, | 639 mem_size_log2, |
642 mem_size_log2, | 640 mem_size_log2, |
643 1, | 641 1, |
644 kDeclDataSegments, | 642 kDeclDataSegments, |
645 1, | 643 1, |
646 U32_LE(dest_addr), | 644 U32(dest_addr), |
647 U32_LE(source_offset), | 645 U32(source_offset), |
648 U32_LE(source_size), | 646 U32(source_size), |
649 1, // init | 647 1, // init |
650 }; | 648 }; |
651 | 649 |
652 STATIC_ASSERT(kDataSize == arraysize(data)); | 650 STATIC_ASSERT(kDataSize == arraysize(data)); |
653 | 651 |
654 if (source_offset < kDataSize && source_size >= 0 && | 652 if (source_offset < kDataSize && source_size >= 0 && |
655 (source_offset + source_size) <= kDataSize) { | 653 (source_offset + source_size) <= kDataSize) { |
656 EXPECT_VERIFIES(data); | 654 EXPECT_VERIFIES(data); |
657 } else { | 655 } else { |
658 EXPECT_FAILURE(data); | 656 EXPECT_FAILURE(data); |
(...skipping 12 matching lines...) Expand all Loading... |
671 | 669 |
672 for (int dest_addr = mem_size - source_size; | 670 for (int dest_addr = mem_size - source_size; |
673 dest_addr < mem_size + source_size; dest_addr++) { | 671 dest_addr < mem_size + source_size; dest_addr++) { |
674 byte data[] = { | 672 byte data[] = { |
675 kDeclMemory, | 673 kDeclMemory, |
676 mem_size_log2, | 674 mem_size_log2, |
677 mem_size_log2, | 675 mem_size_log2, |
678 1, | 676 1, |
679 kDeclDataSegments, | 677 kDeclDataSegments, |
680 1, | 678 1, |
681 U32_LE(dest_addr), | 679 U32(dest_addr), |
682 U32_LE(source_offset), | 680 U32(source_offset), |
683 U32_LE(source_size), | 681 U32(source_size), |
684 1, // init | 682 1, // init |
685 }; | 683 }; |
686 | 684 |
687 if (dest_addr <= (mem_size - source_size)) { | 685 if (dest_addr <= (mem_size - source_size)) { |
688 EXPECT_VERIFIES(data); | 686 EXPECT_VERIFIES(data); |
689 } else { | 687 } else { |
690 EXPECT_FAILURE(data); | 688 EXPECT_FAILURE(data); |
691 } | 689 } |
692 } | 690 } |
693 } | 691 } |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1011 EXPECT_VERIFIES(data); | 1009 EXPECT_VERIFIES(data); |
1012 } | 1010 } |
1013 | 1011 |
1014 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) { | 1012 TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) { |
1015 static const byte data[] = {kDeclImportTable, 0}; | 1013 static const byte data[] = {kDeclImportTable, 0}; |
1016 EXPECT_FAILURE(data); | 1014 EXPECT_FAILURE(data); |
1017 } | 1015 } |
1018 | 1016 |
1019 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { | 1017 TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) { |
1020 static const byte data[] = { | 1018 static const byte data[] = { |
1021 kDeclSignatures, | 1019 kDeclSignatures, 0, kDeclImportTable, 1, |
1022 0, | 1020 SIG_INDEX(0), // sig index |
1023 kDeclImportTable, | 1021 NAME_OFFSET(1), // module name |
1024 1, | 1022 NAME_OFFSET(1), // function name |
1025 0, | |
1026 0, // sig index | |
1027 1, | |
1028 0, | |
1029 0, | |
1030 0, // module name | |
1031 1, | |
1032 0, | |
1033 0, | |
1034 0 // function name | |
1035 }; | 1023 }; |
1036 EXPECT_FAILURE(data); | 1024 EXPECT_FAILURE(data); |
1037 } | 1025 } |
1038 | 1026 |
1039 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) { | 1027 TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) { |
1040 static const byte data[] = { | 1028 static const byte data[] = { |
1041 kDeclSignatures, | 1029 kDeclSignatures, |
1042 1, | 1030 1, |
1043 0, | 1031 VOID_VOID_SIG, |
1044 static_cast<byte>(kAstStmt), | |
1045 kDeclImportTable, | 1032 kDeclImportTable, |
1046 1, | 1033 1, // -- |
1047 0, | 1034 SIG_INDEX(0), // sig index |
1048 0, // sig index | 1035 NAME_OFFSET(1), // module name |
1049 1, | 1036 NAME_OFFSET(1) // function name |
1050 0, | |
1051 0, | |
1052 0, // module name | |
1053 1, | |
1054 0, | |
1055 0, | |
1056 0 // function name | |
1057 }; | 1037 }; |
1058 EXPECT_VERIFIES(data); | 1038 EXPECT_VERIFIES(data); |
1059 } | 1039 } |
1060 | 1040 |
1061 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) { | 1041 TEST_F(WasmModuleVerifyTest, ImportTable_off_end) { |
1062 static const byte data[] = { | 1042 static const byte data[] = { |
1063 kDeclSignatures, | 1043 kDeclSignatures, 1, VOID_VOID_SIG, kDeclImportTable, 1, |
1064 1, | 1044 SIG_INDEX(0), // sig index |
1065 0, | 1045 NAME_OFFSET(1), // module name |
1066 static_cast<byte>(kAstStmt), | 1046 NAME_OFFSET(1), // function name |
1067 kDeclImportTable, | |
1068 1, | |
1069 0, | |
1070 0, // sig index | |
1071 1, | |
1072 0, | |
1073 0, | |
1074 0, // module name | |
1075 1, | |
1076 0, | |
1077 0, | |
1078 0 // function name | |
1079 }; | 1047 }; |
1080 | 1048 |
1081 for (size_t length = 5; length < sizeof(data); length++) { | 1049 for (size_t length = 5; length < sizeof(data); length++) { |
1082 ModuleResult result = DecodeModule(data, data + length); | 1050 ModuleResult result = DecodeModule(data, data + length); |
1083 EXPECT_FALSE(result.ok()); | 1051 EXPECT_FALSE(result.ok()); |
1084 if (result.val) delete result.val; | 1052 if (result.val) delete result.val; |
1085 } | 1053 } |
1086 } | 1054 } |
1087 | 1055 |
| 1056 TEST_F(WasmModuleVerifyTest, ExportTable_empty) { |
| 1057 static const byte data[] = {kDeclSignatures, 0, kDeclFunctions, 0, |
| 1058 kDeclExportTable, 0}; |
| 1059 EXPECT_VERIFIES(data); |
| 1060 } |
| 1061 |
| 1062 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions1) { |
| 1063 static const byte data[] = {kDeclSignatures, 0, kDeclExportTable, 0}; |
| 1064 EXPECT_FAILURE(data); |
| 1065 } |
| 1066 |
| 1067 TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) { |
| 1068 static const byte data[] = {kDeclExportTable, 0}; |
| 1069 EXPECT_FAILURE(data); |
| 1070 } |
| 1071 |
| 1072 TEST_F(WasmModuleVerifyTest, ExportTableOne) { |
| 1073 static const byte data[] = { |
| 1074 kDeclSignatures, 1, // sigs |
| 1075 VOID_VOID_SIG, // -- |
| 1076 kDeclFunctions, 1, // functions |
| 1077 EMPTY_FUNCTION(0), // -- |
| 1078 kDeclExportTable, 1, // exports |
| 1079 FUNC_INDEX(0), // -- |
| 1080 NAME_OFFSET(0) // -- |
| 1081 }; |
| 1082 EXPECT_VERIFIES(data); |
| 1083 } |
| 1084 |
| 1085 TEST_F(WasmModuleVerifyTest, ExportTableTwo) { |
| 1086 static const byte data[] = { |
| 1087 kDeclSignatures, 1, // sigs |
| 1088 VOID_VOID_SIG, // -- |
| 1089 kDeclFunctions, 1, // functions |
| 1090 EMPTY_FUNCTION(0), // -- |
| 1091 kDeclExportTable, 2, // exports |
| 1092 FUNC_INDEX(0), // -- |
| 1093 NAME_OFFSET(1), // -- |
| 1094 FUNC_INDEX(0), // -- |
| 1095 NAME_OFFSET(2) // -- |
| 1096 }; |
| 1097 EXPECT_VERIFIES(data); |
| 1098 } |
| 1099 |
| 1100 TEST_F(WasmModuleVerifyTest, ExportTableThree) { |
| 1101 static const byte data[] = { |
| 1102 kDeclSignatures, 1, // sigs |
| 1103 VOID_VOID_SIG, // -- |
| 1104 kDeclFunctions, 3, // functions |
| 1105 EMPTY_FUNCTION(0), // -- |
| 1106 EMPTY_FUNCTION(0), // -- |
| 1107 EMPTY_FUNCTION(0), // -- |
| 1108 kDeclExportTable, 3, // exports |
| 1109 FUNC_INDEX(0), // -- |
| 1110 NAME_OFFSET(1), // -- |
| 1111 FUNC_INDEX(1), // -- |
| 1112 NAME_OFFSET(2), // -- |
| 1113 FUNC_INDEX(2), // -- |
| 1114 NAME_OFFSET(2) // -- |
| 1115 }; |
| 1116 EXPECT_VERIFIES(data); |
| 1117 } |
| 1118 |
| 1119 TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) { |
| 1120 for (byte i = 0; i < 6; i++) { |
| 1121 const byte data[] = { |
| 1122 kDeclSignatures, 1, // sigs |
| 1123 VOID_VOID_SIG, // -- |
| 1124 kDeclFunctions, 3, // functions |
| 1125 EMPTY_FUNCTION(0), // -- |
| 1126 EMPTY_FUNCTION(0), // -- |
| 1127 EMPTY_FUNCTION(0), // -- |
| 1128 kDeclExportTable, 1, // exports |
| 1129 FUNC_INDEX(i), // -- |
| 1130 NAME_OFFSET(1) // -- |
| 1131 }; |
| 1132 |
| 1133 if (i < 3) { |
| 1134 EXPECT_VERIFIES(data); |
| 1135 } else { |
| 1136 EXPECT_FAILURE(data); |
| 1137 } |
| 1138 } |
| 1139 } |
| 1140 |
| 1141 TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) { |
| 1142 static const byte data[] = { |
| 1143 kDeclSignatures, 1, // sigs |
| 1144 VOID_VOID_SIG, // -- |
| 1145 kDeclFunctions, 1, // functions |
| 1146 EMPTY_FUNCTION(0), // -- |
| 1147 kDeclExportTable, 1, // exports |
| 1148 FUNC_INDEX(0), // -- |
| 1149 NAME_OFFSET(0) // -- |
| 1150 }; |
| 1151 |
| 1152 for (int length = 13; length < sizeof(data); length++) { |
| 1153 ModuleResult result = DecodeModule(data, data + length); |
| 1154 EXPECT_FALSE(result.ok()); |
| 1155 if (result.val) delete result.val; |
| 1156 } |
| 1157 } |
| 1158 |
1088 } // namespace wasm | 1159 } // namespace wasm |
1089 } // namespace internal | 1160 } // namespace internal |
1090 } // namespace v8 | 1161 } // namespace v8 |
OLD | NEW |