blob: 7090c1fab9c54db9cdca9f540a483c2f5607409a [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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
3// found in the LICENSE file.
4
5#include "test/unittests/test-utils.h"
6
7#include "src/wasm/module-decoder.h"
Ben Murdochda12d292016-06-02 14:46:10 +01008#include "src/wasm/wasm-macro-gen.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00009#include "src/wasm/wasm-opcodes.h"
10
11namespace v8 {
12namespace internal {
13namespace wasm {
14
Ben Murdochda12d292016-06-02 14:46:10 +010015#define EMPTY_FUNCTION(sig_index) 0, SIG_INDEX(sig_index), U16_LE(0)
Ben Murdochc5610432016-08-08 18:44:38 +010016#define SIZEOF_EMPTY_FUNCTION ((size_t)5)
Ben Murdochda12d292016-06-02 14:46:10 +010017#define EMPTY_BODY 0
Ben Murdochc5610432016-08-08 18:44:38 +010018#define SIZEOF_EMPTY_BODY ((size_t)1)
Ben Murdochda12d292016-06-02 14:46:10 +010019#define NOP_BODY 2, 0, kExprNop
Ben Murdochc5610432016-08-08 18:44:38 +010020#define SIZEOF_NOP_BODY ((size_t)3)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000021
Ben Murdochc5610432016-08-08 18:44:38 +010022#define SIG_ENTRY_i_i SIG_ENTRY_x_x(kLocalI32, kLocalI32)
23
24#define UNKNOWN_EMPTY_SECTION_NAME 1, '\0'
25#define UNKNOWN_SECTION_NAME 4, 'l', 'u', 'l', 'z'
26
27#define SECTION(NAME, EXTRA_SIZE) WASM_SECTION_##NAME, U32V_1(EXTRA_SIZE)
28
29#define SIGNATURES_SECTION(count, ...) \
30 SECTION(SIGNATURES, 1 + 3 * (count)), U32V_1(count), __VA_ARGS__
31#define FUNCTION_SIGNATURES_SECTION(count, ...) \
32 SECTION(FUNCTION_SIGNATURES, 1 + (count)), U32V_1(count), __VA_ARGS__
33
34#define FOO_STRING 3, 'f', 'o', 'o'
35#define NO_LOCAL_NAMES 0
36
37#define EMPTY_SIGNATURES_SECTION SECTION(SIGNATURES, 1), 0
38#define EMPTY_FUNCTION_SIGNATURES_SECTION SECTION(FUNCTION_SIGNATURES, 1), 0
39#define EMPTY_FUNCTION_BODIES_SECTION SECTION(FUNCTION_BODIES, 1), 0
40#define EMPTY_NAMES_SECTION SECTION(NAMES, 1), 0
41
42#define SIGNATURES_SECTION_VOID_VOID \
43 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v), 1, SIG_ENTRY_v_v
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000044
45#define EXPECT_VERIFIES(data) \
46 do { \
47 ModuleResult result = DecodeModule(data, data + arraysize(data)); \
48 EXPECT_TRUE(result.ok()); \
49 if (result.val) delete result.val; \
50 } while (false)
51
Ben Murdochda12d292016-06-02 14:46:10 +010052#define EXPECT_FAILURE_LEN(data, length) \
53 do { \
54 ModuleResult result = DecodeModule(data, data + length); \
55 EXPECT_FALSE(result.ok()); \
56 if (result.val) delete result.val; \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000057 } while (false)
58
Ben Murdochda12d292016-06-02 14:46:10 +010059#define EXPECT_FAILURE(data) EXPECT_FAILURE_LEN(data, sizeof(data))
60
61#define EXPECT_OFF_END_FAILURE(data, min, max) \
62 do { \
63 for (size_t length = min; length < max; length++) { \
64 EXPECT_FAILURE_LEN(data, length); \
65 } \
66 } while (false)
67
Ben Murdochc5610432016-08-08 18:44:38 +010068#define EXPECT_OK(result) \
69 do { \
70 EXPECT_TRUE(result.ok()); \
71 if (!result.ok()) { \
72 if (result.val) delete result.val; \
73 return; \
74 } \
75 } while (false)
76
Ben Murdochda12d292016-06-02 14:46:10 +010077static size_t SizeOfVarInt(size_t value) {
78 size_t size = 0;
79 do {
80 size++;
81 value = value >> 7;
82 } while (value > 0);
83 return size;
84}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000085
86struct LocalTypePair {
87 uint8_t code;
88 LocalType type;
89} kLocalTypes[] = {{kLocalI32, kAstI32},
90 {kLocalI64, kAstI64},
91 {kLocalF32, kAstF32},
92 {kLocalF64, kAstF64}};
93
Ben Murdochc5610432016-08-08 18:44:38 +010094class WasmModuleVerifyTest : public TestWithIsolateAndZone {
Ben Murdochda12d292016-06-02 14:46:10 +010095 public:
96 ModuleResult DecodeModule(const byte* module_start, const byte* module_end) {
97 // Add the WASM magic and version number automatically.
98 size_t size = static_cast<size_t>(module_end - module_start);
99 byte header[] = {WASM_MODULE_HEADER};
100 size_t total = sizeof(header) + size;
101 auto temp = new byte[total];
102 memcpy(temp, header, sizeof(header));
103 memcpy(temp + sizeof(header), module_start, size);
Ben Murdochc5610432016-08-08 18:44:38 +0100104 ModuleResult result = DecodeWasmModule(isolate(), zone(), temp,
105 temp + total, false, kWasmOrigin);
Ben Murdochda12d292016-06-02 14:46:10 +0100106 delete[] temp;
107 return result;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000108 }
Ben Murdochda12d292016-06-02 14:46:10 +0100109 ModuleResult DecodeModuleNoHeader(const byte* module_start,
110 const byte* module_end) {
Ben Murdochc5610432016-08-08 18:44:38 +0100111 return DecodeWasmModule(isolate(), zone(), module_start, module_end, false,
Ben Murdochda12d292016-06-02 14:46:10 +0100112 kWasmOrigin);
113 }
114};
115
116TEST_F(WasmModuleVerifyTest, WrongMagic) {
117 for (uint32_t x = 1; x; x <<= 1) {
118 const byte data[] = {U32_LE(kWasmMagic ^ x), U32_LE(kWasmVersion),
119 SECTION(END, 0)};
120 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data));
121 EXPECT_FALSE(result.ok());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000122 if (result.val) delete result.val;
123 }
124}
125
Ben Murdochda12d292016-06-02 14:46:10 +0100126TEST_F(WasmModuleVerifyTest, WrongVersion) {
127 for (uint32_t x = 1; x; x <<= 1) {
128 const byte data[] = {U32_LE(kWasmMagic), U32_LE(kWasmVersion ^ x),
129 SECTION(END, 0)};
130 ModuleResult result = DecodeModuleNoHeader(data, data + sizeof(data));
131 EXPECT_FALSE(result.ok());
132 if (result.val) delete result.val;
133 }
134}
135
136TEST_F(WasmModuleVerifyTest, DecodeEmpty) {
137 static const byte data[] = {SECTION(END, 0)};
138 EXPECT_VERIFIES(data);
139}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000140
141TEST_F(WasmModuleVerifyTest, OneGlobal) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100142 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100143 SECTION(GLOBALS, 5), // --
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000144 1,
Ben Murdochda12d292016-06-02 14:46:10 +0100145 NAME_LENGTH(1),
146 'g', // name
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000147 kMemI32, // memory type
148 0, // exported
149 };
150
151 {
152 // Should decode to exactly one global.
153 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100154 EXPECT_OK(result);
Ben Murdochda12d292016-06-02 14:46:10 +0100155 EXPECT_EQ(1, result.val->globals.size());
156 EXPECT_EQ(0, result.val->functions.size());
157 EXPECT_EQ(0, result.val->data_segments.size());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000158
Ben Murdochda12d292016-06-02 14:46:10 +0100159 WasmGlobal* global = &result.val->globals.back();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000160
Ben Murdochda12d292016-06-02 14:46:10 +0100161 EXPECT_EQ(1, global->name_length);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000162 EXPECT_EQ(MachineType::Int32(), global->type);
163 EXPECT_EQ(0, global->offset);
164 EXPECT_FALSE(global->exported);
165
166 if (result.val) delete result.val;
167 }
168
Ben Murdochda12d292016-06-02 14:46:10 +0100169 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000170}
171
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000172TEST_F(WasmModuleVerifyTest, ZeroGlobals) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100173 static const byte data[] = {
Ben Murdochda12d292016-06-02 14:46:10 +0100174 SECTION(GLOBALS, 1), // --
175 0, // declare 0 globals
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000176 };
177 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100178 EXPECT_OK(result);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000179 if (result.val) delete result.val;
180}
181
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000182static void AppendUint32v(std::vector<byte>& buffer, uint32_t val) {
183 while (true) {
184 uint32_t next = val >> 7;
185 uint32_t out = val & 0x7f;
186 if (next) {
187 buffer.push_back(static_cast<byte>(0x80 | out));
188 val = next;
189 } else {
190 buffer.push_back(static_cast<byte>(out));
191 break;
192 }
193 }
194}
195
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000196TEST_F(WasmModuleVerifyTest, NGlobals) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100197 static const byte data[] = {
Ben Murdochda12d292016-06-02 14:46:10 +0100198 NO_NAME, // name length
199 kMemI32, // memory type
200 0, // exported
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201 };
Ben Murdochda12d292016-06-02 14:46:10 +0100202
203 for (uint32_t i = 0; i < 1000000; i = i * 13 + 1) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000204 std::vector<byte> buffer;
Ben Murdochc5610432016-08-08 18:44:38 +0100205 size_t size = SizeOfVarInt(i) + i * sizeof(data);
206 const byte globals[] = {WASM_SECTION_GLOBALS, U32V_5(size)};
Ben Murdochda12d292016-06-02 14:46:10 +0100207 for (size_t g = 0; g != sizeof(globals); ++g) {
208 buffer.push_back(globals[g]);
209 }
210 AppendUint32v(buffer, i); // Number of globals.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000211 for (uint32_t j = 0; j < i; j++) {
Ben Murdochda12d292016-06-02 14:46:10 +0100212 buffer.insert(buffer.end(), data, data + sizeof(data));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000213 }
214
215 ModuleResult result = DecodeModule(&buffer[0], &buffer[0] + buffer.size());
Ben Murdochc5610432016-08-08 18:44:38 +0100216 EXPECT_OK(result);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000217 if (result.val) delete result.val;
218 }
219}
220
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000221TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100222 static const byte data[] = {
Ben Murdochda12d292016-06-02 14:46:10 +0100223 SECTION(GLOBALS, 7),
224 1, // declare one global
225 NO_NAME, // name offset
226 33, // memory type
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000227 0, // exported
228 };
229
230 EXPECT_FAILURE(data);
231}
232
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000233TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100234 static const byte data[] = {
Ben Murdochda12d292016-06-02 14:46:10 +0100235 SECTION(GLOBALS, 7),
236 1, // declare one global
237 NO_NAME, // name offset
238 33, // memory type
239 0, // exported
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000240 };
241
242 EXPECT_FAILURE(data);
243}
244
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000245TEST_F(WasmModuleVerifyTest, TwoGlobals) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100246 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100247 SECTION(GLOBALS, 7),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000248 2,
Ben Murdochda12d292016-06-02 14:46:10 +0100249 NO_NAME, // #0: name length
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000250 kMemF32, // memory type
251 0, // exported
Ben Murdochda12d292016-06-02 14:46:10 +0100252 NO_NAME, // #1: name length
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000253 kMemF64, // memory type
254 1, // exported
255 };
256
257 {
258 // Should decode to exactly two globals.
259 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100260 EXPECT_OK(result);
Ben Murdochda12d292016-06-02 14:46:10 +0100261 EXPECT_EQ(2, result.val->globals.size());
262 EXPECT_EQ(0, result.val->functions.size());
263 EXPECT_EQ(0, result.val->data_segments.size());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000264
Ben Murdochda12d292016-06-02 14:46:10 +0100265 WasmGlobal* g0 = &result.val->globals[0];
266 WasmGlobal* g1 = &result.val->globals[1];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000267
Ben Murdochda12d292016-06-02 14:46:10 +0100268 EXPECT_EQ(0, g0->name_length);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000269 EXPECT_EQ(MachineType::Float32(), g0->type);
270 EXPECT_EQ(0, g0->offset);
271 EXPECT_FALSE(g0->exported);
272
Ben Murdochda12d292016-06-02 14:46:10 +0100273 EXPECT_EQ(0, g1->name_length);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000274 EXPECT_EQ(MachineType::Float64(), g1->type);
275 EXPECT_EQ(0, g1->offset);
276 EXPECT_TRUE(g1->exported);
277
278 if (result.val) delete result.val;
279 }
280
Ben Murdochda12d292016-06-02 14:46:10 +0100281 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000282}
283
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000284TEST_F(WasmModuleVerifyTest, OneSignature) {
Ben Murdochda12d292016-06-02 14:46:10 +0100285 {
Ben Murdochc5610432016-08-08 18:44:38 +0100286 static const byte data[] = {SIGNATURES_SECTION_VOID_VOID};
Ben Murdochda12d292016-06-02 14:46:10 +0100287 EXPECT_VERIFIES(data);
288 }
289
290 {
Ben Murdochc5610432016-08-08 18:44:38 +0100291 static const byte data[] = {SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_x_x),
292 1, SIG_ENTRY_i_i};
Ben Murdochda12d292016-06-02 14:46:10 +0100293 EXPECT_VERIFIES(data);
294 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000295}
296
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297TEST_F(WasmModuleVerifyTest, MultipleSignatures) {
298 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100299 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_x_x +
300 SIZEOF_SIG_ENTRY_x_xx), // --
301 3, // --
302 SIG_ENTRY_v_v, // void -> void
303 SIG_ENTRY_x_x(kLocalI32, kLocalF32), // f32 -> i32
304 SIG_ENTRY_x_xx(kLocalI32, kLocalF64, kLocalF64), // f64,f64 -> i32
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000305 };
306
307 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100308 EXPECT_OK(result);
Ben Murdochda12d292016-06-02 14:46:10 +0100309 EXPECT_EQ(3, result.val->signatures.size());
310 if (result.val->signatures.size() == 3) {
311 EXPECT_EQ(0, result.val->signatures[0]->return_count());
312 EXPECT_EQ(1, result.val->signatures[1]->return_count());
313 EXPECT_EQ(1, result.val->signatures[2]->return_count());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000314
Ben Murdochda12d292016-06-02 14:46:10 +0100315 EXPECT_EQ(0, result.val->signatures[0]->parameter_count());
316 EXPECT_EQ(1, result.val->signatures[1]->parameter_count());
317 EXPECT_EQ(2, result.val->signatures[2]->parameter_count());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000318 }
319 if (result.val) delete result.val;
320
Ben Murdochda12d292016-06-02 14:46:10 +0100321 EXPECT_OFF_END_FAILURE(data, 1, sizeof(data));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000322}
323
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000324TEST_F(WasmModuleVerifyTest, FunctionWithoutSig) {
325 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100326 SECTION(OLD_FUNCTIONS, 25), 1,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000327 // func#0 ------------------------------------------------------
Ben Murdochda12d292016-06-02 14:46:10 +0100328 SIG_INDEX(0), // signature index
329 NO_NAME, // name length
330 U32_LE(0), // code start offset
331 U32_LE(0), // code end offset
332 U16_LE(899), // local int32 count
333 U16_LE(799), // local int64 count
334 U16_LE(699), // local float32 count
335 U16_LE(599), // local float64 count
336 0, // exported
Ben Murdochc5610432016-08-08 18:44:38 +0100337 0 // external
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000338 };
339
340 ModuleResult result = DecodeModule(data, data + arraysize(data));
341 EXPECT_FALSE(result.ok());
342 if (result.val) delete result.val;
343}
344
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000345TEST_F(WasmModuleVerifyTest, OneEmptyVoidVoidFunction) {
Ben Murdochc5610432016-08-08 18:44:38 +0100346 const int kCodeStartOffset = 41;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000347 const int kCodeEndOffset = kCodeStartOffset + 1;
348
349 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100350 // signatures
351 SIGNATURES_SECTION_VOID_VOID,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000352 // func#0 ------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100353 SECTION(OLD_FUNCTIONS, 10), 1, kDeclFunctionExport | kDeclFunctionName,
Ben Murdochda12d292016-06-02 14:46:10 +0100354 SIG_INDEX(0), // signature index
355 NAME_LENGTH(2), 'h', 'i', // name
Ben Murdochda12d292016-06-02 14:46:10 +0100356 1, 0, // size
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000357 kExprNop,
358 };
359
360 {
361 // Should decode to exactly one function.
362 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100363 EXPECT_OK(result);
Ben Murdochda12d292016-06-02 14:46:10 +0100364 EXPECT_EQ(0, result.val->globals.size());
365 EXPECT_EQ(1, result.val->signatures.size());
366 EXPECT_EQ(1, result.val->functions.size());
367 EXPECT_EQ(0, result.val->data_segments.size());
368 EXPECT_EQ(0, result.val->function_table.size());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000369
Ben Murdochda12d292016-06-02 14:46:10 +0100370 WasmFunction* function = &result.val->functions.back();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000371
Ben Murdochc5610432016-08-08 18:44:38 +0100372 EXPECT_EQ(37, function->name_offset);
Ben Murdochda12d292016-06-02 14:46:10 +0100373 EXPECT_EQ(2, function->name_length);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000374 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
375 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
376
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000377 EXPECT_TRUE(function->exported);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000378
379 if (result.val) delete result.val;
380 }
381
Ben Murdochda12d292016-06-02 14:46:10 +0100382 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000383}
384
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000385TEST_F(WasmModuleVerifyTest, OneFunctionWithNopBody) {
Ben Murdochc5610432016-08-08 18:44:38 +0100386 static const byte kCodeStartOffset = 38;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000387 static const byte kCodeEndOffset = kCodeStartOffset + 1;
388
389 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100390 SIGNATURES_SECTION_VOID_VOID, // --
391 SECTION(OLD_FUNCTIONS, 7), 1,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392 // func#0 ------------------------------------------------------
393 0, // no name, no locals
394 0, 0, // signature index
395 1, 0, // body size
396 kExprNop // body
397 };
398
399 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100400 EXPECT_OK(result);
Ben Murdochda12d292016-06-02 14:46:10 +0100401 EXPECT_EQ(1, result.val->functions.size());
402 WasmFunction* function = &result.val->functions.back();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000403
Ben Murdochda12d292016-06-02 14:46:10 +0100404 EXPECT_EQ(0, function->name_length);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000405 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
406 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
407
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000408 EXPECT_FALSE(function->exported);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000409
410 if (result.val) delete result.val;
411}
412
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000413TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) {
Ben Murdochc5610432016-08-08 18:44:38 +0100414 static const byte kNameOffset = 49;
415 static const byte kCodeStartOffset = 53;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000416 static const byte kCodeEndOffset = kCodeStartOffset + 3;
Ben Murdochc5610432016-08-08 18:44:38 +0100417 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 22;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000418
419 static const byte data[] = {
420 // global#0 --------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100421 SECTION(GLOBALS, 4), 1,
Ben Murdochda12d292016-06-02 14:46:10 +0100422 0, // name length
423 kMemU8, // memory type
424 0, // exported
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000425 // sig#0 -----------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100426 SIGNATURES_SECTION_VOID_VOID,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000427 // func#0 ----------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100428 SECTION(OLD_FUNCTIONS, 12), 1,
429 kDeclFunctionName, // --
430 SIG_INDEX(0), // signature index
431 2, 'h', 'i', // name
432 3, 0, // body size
433 kExprNop, // func#0 body
434 kExprNop, // func#0 body
435 kExprNop, // func#0 body
436 // memory section --------------------------------------------
437 SECTION(MEMORY, 3), 28, 28, 1,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000438 // segment#0 -------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100439 SECTION(DATA_SEGMENTS, 10), 1,
Ben Murdochda12d292016-06-02 14:46:10 +0100440 U32V_3(0x8b3ae), // dest addr
441 U32V_1(5), // source size
442 0, 1, 2, 3, 4, // data bytes
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000443 // rest ------------------------------------------------------
Ben Murdochda12d292016-06-02 14:46:10 +0100444 SECTION(END, 0),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000445 };
446
447 {
448 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100449 EXPECT_OK(result);
Ben Murdochda12d292016-06-02 14:46:10 +0100450 EXPECT_EQ(1, result.val->globals.size());
451 EXPECT_EQ(1, result.val->functions.size());
452 EXPECT_EQ(1, result.val->data_segments.size());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000453
Ben Murdochda12d292016-06-02 14:46:10 +0100454 WasmGlobal* global = &result.val->globals.back();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000455
Ben Murdochda12d292016-06-02 14:46:10 +0100456 EXPECT_EQ(0, global->name_length);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000457 EXPECT_EQ(MachineType::Uint8(), global->type);
458 EXPECT_EQ(0, global->offset);
459 EXPECT_FALSE(global->exported);
460
Ben Murdochda12d292016-06-02 14:46:10 +0100461 WasmFunction* function = &result.val->functions.back();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000462
Ben Murdochc5610432016-08-08 18:44:38 +0100463 EXPECT_EQ(kNameOffset, function->name_offset);
Ben Murdochda12d292016-06-02 14:46:10 +0100464 EXPECT_EQ(2, function->name_length);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000465 EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
466 EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
467
468 EXPECT_FALSE(function->exported);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000469
Ben Murdochda12d292016-06-02 14:46:10 +0100470 WasmDataSegment* segment = &result.val->data_segments.back();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000471
472 EXPECT_EQ(0x8b3ae, segment->dest_addr);
Ben Murdochda12d292016-06-02 14:46:10 +0100473 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000474 EXPECT_EQ(5, segment->source_size);
475 EXPECT_TRUE(segment->init);
476
477 if (result.val) delete result.val;
478 }
479}
480
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000481TEST_F(WasmModuleVerifyTest, OneDataSegment) {
Ben Murdochc5610432016-08-08 18:44:38 +0100482 const byte kDataSegmentSourceOffset = 30;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000483 const byte data[] = {
Ben Murdochda12d292016-06-02 14:46:10 +0100484 SECTION(MEMORY, 3),
485 28,
486 28,
487 1,
488 SECTION(DATA_SEGMENTS, 8),
489 1,
490 U32V_3(0x9bbaa), // dest addr
491 U32V_1(3), // source size
492 'a',
493 'b',
494 'c' // data bytes
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000495 };
496
497 {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100498 EXPECT_VERIFIES(data);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000499 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100500 EXPECT_OK(result);
Ben Murdochda12d292016-06-02 14:46:10 +0100501 EXPECT_EQ(0, result.val->globals.size());
502 EXPECT_EQ(0, result.val->functions.size());
503 EXPECT_EQ(1, result.val->data_segments.size());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000504
Ben Murdochda12d292016-06-02 14:46:10 +0100505 WasmDataSegment* segment = &result.val->data_segments.back();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000506
507 EXPECT_EQ(0x9bbaa, segment->dest_addr);
Ben Murdochda12d292016-06-02 14:46:10 +0100508 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000509 EXPECT_EQ(3, segment->source_size);
510 EXPECT_TRUE(segment->init);
511
512 if (result.val) delete result.val;
513 }
514
Ben Murdochda12d292016-06-02 14:46:10 +0100515 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000516}
517
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000518TEST_F(WasmModuleVerifyTest, TwoDataSegments) {
Ben Murdochc5610432016-08-08 18:44:38 +0100519 const byte kDataSegment0SourceOffset = 30;
520 const byte kDataSegment1SourceOffset = 30 + 8;
Ben Murdochda12d292016-06-02 14:46:10 +0100521
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000522 const byte data[] = {
Ben Murdochda12d292016-06-02 14:46:10 +0100523 SECTION(MEMORY, 3),
524 28,
525 28,
526 1,
Ben Murdochc5610432016-08-08 18:44:38 +0100527 SECTION(DATA_SEGMENTS, 23),
Ben Murdochda12d292016-06-02 14:46:10 +0100528 2, // segment count
529 U32V_3(0x7ffee), // #0: dest addr
530 U32V_1(4), // source size
531 1,
532 2,
533 3,
534 4, // data bytes
535 U32V_3(0x6ddcc), // #1: dest addr
536 U32V_1(10), // source size
537 1,
538 2,
539 3,
540 4,
541 5,
542 6,
543 7,
544 8,
545 9,
546 10 // data bytes
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000547 };
548
549 {
550 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100551 EXPECT_OK(result);
Ben Murdochda12d292016-06-02 14:46:10 +0100552 EXPECT_EQ(0, result.val->globals.size());
553 EXPECT_EQ(0, result.val->functions.size());
554 EXPECT_EQ(2, result.val->data_segments.size());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000555
Ben Murdochda12d292016-06-02 14:46:10 +0100556 WasmDataSegment* s0 = &result.val->data_segments[0];
557 WasmDataSegment* s1 = &result.val->data_segments[1];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000558
559 EXPECT_EQ(0x7ffee, s0->dest_addr);
Ben Murdochda12d292016-06-02 14:46:10 +0100560 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000561 EXPECT_EQ(4, s0->source_size);
Ben Murdochda12d292016-06-02 14:46:10 +0100562 EXPECT_TRUE(s0->init);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000563
564 EXPECT_EQ(0x6ddcc, s1->dest_addr);
Ben Murdochda12d292016-06-02 14:46:10 +0100565 EXPECT_EQ(kDataSegment1SourceOffset, s1->source_offset);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000566 EXPECT_EQ(10, s1->source_size);
567 EXPECT_TRUE(s1->init);
568
569 if (result.val) delete result.val;
570 }
571
Ben Murdochda12d292016-06-02 14:46:10 +0100572 EXPECT_OFF_END_FAILURE(data, 13, sizeof(data));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000573}
574
Ben Murdoch097c5b22016-05-18 11:27:45 +0100575TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidDest) {
576 const int source_size = 3;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100577
Ben Murdochda12d292016-06-02 14:46:10 +0100578 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) {
579 int mem_size = mem_pages * 0x10000; // 64k pages.
Ben Murdoch097c5b22016-05-18 11:27:45 +0100580
581 for (int dest_addr = mem_size - source_size;
582 dest_addr < mem_size + source_size; dest_addr++) {
Ben Murdochda12d292016-06-02 14:46:10 +0100583 byte data[] = {SECTION(MEMORY, 3),
584 mem_pages,
585 mem_pages,
586 1,
Ben Murdochc5610432016-08-08 18:44:38 +0100587 SECTION(DATA_SEGMENTS, 8),
Ben Murdochda12d292016-06-02 14:46:10 +0100588 1,
589 U32V_3(dest_addr),
590 U32V_1(source_size),
591 'a',
592 'b',
593 'c'};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100594
595 if (dest_addr <= (mem_size - source_size)) {
596 EXPECT_VERIFIES(data);
597 } else {
598 EXPECT_FAILURE(data);
599 }
600 }
601 }
602}
603
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000604TEST_F(WasmModuleVerifyTest, OneIndirectFunction) {
605 static const byte data[] = {
606 // sig#0 -------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100607 SIGNATURES_SECTION_VOID_VOID,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000608 // func#0 ------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100609 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 1, // --
610 EMPTY_FUNCTION(0),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000611 // indirect table ----------------------------------------------
Ben Murdochda12d292016-06-02 14:46:10 +0100612 SECTION(FUNCTION_TABLE, 2), 1, U32V_1(0)};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000613
614 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100615 EXPECT_OK(result);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000616 if (result.ok()) {
Ben Murdochda12d292016-06-02 14:46:10 +0100617 EXPECT_EQ(1, result.val->signatures.size());
618 EXPECT_EQ(1, result.val->functions.size());
619 EXPECT_EQ(1, result.val->function_table.size());
620 EXPECT_EQ(0, result.val->function_table[0]);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000621 }
622 if (result.val) delete result.val;
623}
624
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000625TEST_F(WasmModuleVerifyTest, MultipleIndirectFunctions) {
626 static const byte data[] = {
627 // sig#0 -------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100628 SECTION(SIGNATURES, 1 + SIZEOF_SIG_ENTRY_v_v + SIZEOF_SIG_ENTRY_v_x),
629 2, // --
630 SIG_ENTRY_v_v, // void -> void
631 SIG_ENTRY_v_x(kLocalI32), // void -> i32
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000632 // func#0 ------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100633 SECTION(OLD_FUNCTIONS, 1 + 4 * SIZEOF_EMPTY_FUNCTION), 4, // --
634 EMPTY_FUNCTION(0), // --
635 EMPTY_FUNCTION(1), // --
636 EMPTY_FUNCTION(0), // --
637 EMPTY_FUNCTION(1), // --
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000638 // indirect table ----------------------------------------------
Ben Murdochda12d292016-06-02 14:46:10 +0100639 SECTION(FUNCTION_TABLE, 9), 8,
640 U32V_1(0), // --
641 U32V_1(1), // --
642 U32V_1(2), // --
643 U32V_1(3), // --
644 U32V_1(0), // --
645 U32V_1(1), // --
646 U32V_1(2), // --
647 U32V_1(3), // --
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000648 };
649
650 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100651 EXPECT_OK(result);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000652 if (result.ok()) {
Ben Murdochda12d292016-06-02 14:46:10 +0100653 EXPECT_EQ(2, result.val->signatures.size());
654 EXPECT_EQ(4, result.val->functions.size());
655 EXPECT_EQ(8, result.val->function_table.size());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000656 for (int i = 0; i < 8; i++) {
Ben Murdochda12d292016-06-02 14:46:10 +0100657 EXPECT_EQ(i & 3, result.val->function_table[i]);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000658 }
659 }
660 if (result.val) delete result.val;
661}
662
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000663TEST_F(WasmModuleVerifyTest, IndirectFunctionNoFunctions) {
664 static const byte data[] = {
665 // sig#0 -------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100666 SIGNATURES_SECTION_VOID_VOID,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000667 // indirect table ----------------------------------------------
Ben Murdochda12d292016-06-02 14:46:10 +0100668 SECTION(FUNCTION_TABLE, 3), 1, 0, 0,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000669 };
670
671 EXPECT_FAILURE(data);
672}
673
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000674TEST_F(WasmModuleVerifyTest, IndirectFunctionInvalidIndex) {
675 static const byte data[] = {
676 // sig#0 -------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100677 SIGNATURES_SECTION_VOID_VOID,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000678 // functions ---------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100679 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION), 1, // --
680 EMPTY_FUNCTION(0),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000681 // indirect table ----------------------------------------------
Ben Murdochda12d292016-06-02 14:46:10 +0100682 SECTION(FUNCTION_TABLE, 3), 1, 1, 0,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000683 };
684
685 EXPECT_FAILURE(data);
686}
687
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000688class WasmSignatureDecodeTest : public TestWithZone {};
689
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000690TEST_F(WasmSignatureDecodeTest, Ok_v_v) {
Ben Murdochc5610432016-08-08 18:44:38 +0100691 static const byte data[] = {SIG_ENTRY_v_v};
Ben Murdochda12d292016-06-02 14:46:10 +0100692 base::AccountingAllocator allocator;
693 Zone zone(&allocator);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000694 FunctionSig* sig =
695 DecodeWasmSignatureForTesting(&zone, data, data + arraysize(data));
696
697 EXPECT_TRUE(sig != nullptr);
698 EXPECT_EQ(0, sig->parameter_count());
699 EXPECT_EQ(0, sig->return_count());
700}
701
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000702TEST_F(WasmSignatureDecodeTest, Ok_t_v) {
703 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
704 LocalTypePair ret_type = kLocalTypes[i];
Ben Murdochc5610432016-08-08 18:44:38 +0100705 const byte data[] = {SIG_ENTRY_x(ret_type.code)};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000706 FunctionSig* sig =
707 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
708
709 EXPECT_TRUE(sig != nullptr);
710 EXPECT_EQ(0, sig->parameter_count());
711 EXPECT_EQ(1, sig->return_count());
712 EXPECT_EQ(ret_type.type, sig->GetReturn());
713 }
714}
715
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000716TEST_F(WasmSignatureDecodeTest, Ok_v_t) {
717 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
718 LocalTypePair param_type = kLocalTypes[i];
Ben Murdochc5610432016-08-08 18:44:38 +0100719 const byte data[] = {SIG_ENTRY_v_x(param_type.code)};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000720 FunctionSig* sig =
721 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
722
723 EXPECT_TRUE(sig != nullptr);
724 EXPECT_EQ(1, sig->parameter_count());
725 EXPECT_EQ(0, sig->return_count());
726 EXPECT_EQ(param_type.type, sig->GetParam(0));
727 }
728}
729
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000730TEST_F(WasmSignatureDecodeTest, Ok_t_t) {
731 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
732 LocalTypePair ret_type = kLocalTypes[i];
733 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
734 LocalTypePair param_type = kLocalTypes[j];
Ben Murdochc5610432016-08-08 18:44:38 +0100735 const byte data[] = {SIG_ENTRY_x_x(ret_type.code, param_type.code)};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000736 FunctionSig* sig =
737 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
738
739 EXPECT_TRUE(sig != nullptr);
740 EXPECT_EQ(1, sig->parameter_count());
741 EXPECT_EQ(1, sig->return_count());
742 EXPECT_EQ(param_type.type, sig->GetParam(0));
743 EXPECT_EQ(ret_type.type, sig->GetReturn());
744 }
745 }
746}
747
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000748TEST_F(WasmSignatureDecodeTest, Ok_i_tt) {
749 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
750 LocalTypePair p0_type = kLocalTypes[i];
751 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
752 LocalTypePair p1_type = kLocalTypes[j];
Ben Murdochc5610432016-08-08 18:44:38 +0100753 const byte data[] = {
754 SIG_ENTRY_x_xx(kLocalI32, p0_type.code, p1_type.code)};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000755 FunctionSig* sig =
756 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
757
758 EXPECT_TRUE(sig != nullptr);
759 EXPECT_EQ(2, sig->parameter_count());
760 EXPECT_EQ(1, sig->return_count());
761 EXPECT_EQ(p0_type.type, sig->GetParam(0));
762 EXPECT_EQ(p1_type.type, sig->GetParam(1));
763 }
764 }
765}
766
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000767TEST_F(WasmSignatureDecodeTest, Fail_off_end) {
768 byte data[256];
769 for (int p = 0; p <= 255; p = p + 1 + p * 3) {
770 for (int i = 0; i <= p; i++) data[i] = kLocalI32;
771 data[0] = static_cast<byte>(p);
772
773 for (int i = 0; i < p + 1; i++) {
774 // Should fall off the end for all signatures.
775 FunctionSig* sig = DecodeWasmSignatureForTesting(zone(), data, data + i);
776 EXPECT_EQ(nullptr, sig);
777 }
778 }
779}
780
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000781TEST_F(WasmSignatureDecodeTest, Fail_invalid_type) {
782 byte kInvalidType = 76;
Ben Murdochc5610432016-08-08 18:44:38 +0100783 for (size_t i = 0; i < SIZEOF_SIG_ENTRY_x_xx; i++) {
784 byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalI32)};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000785 data[i] = kInvalidType;
786 FunctionSig* sig =
787 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
788 EXPECT_EQ(nullptr, sig);
789 }
790}
791
Ben Murdochc5610432016-08-08 18:44:38 +0100792TEST_F(WasmSignatureDecodeTest, Fail_invalid_ret_type1) {
793 static const byte data[] = {SIG_ENTRY_x_x(kLocalVoid, kLocalI32)};
794 FunctionSig* sig =
795 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
796 EXPECT_EQ(nullptr, sig);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000797}
798
Ben Murdochc5610432016-08-08 18:44:38 +0100799TEST_F(WasmSignatureDecodeTest, Fail_invalid_param_type1) {
800 static const byte data[] = {SIG_ENTRY_x_x(kLocalI32, kLocalVoid)};
801 FunctionSig* sig =
802 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
803 EXPECT_EQ(nullptr, sig);
804}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000805
Ben Murdochc5610432016-08-08 18:44:38 +0100806TEST_F(WasmSignatureDecodeTest, Fail_invalid_param_type2) {
807 static const byte data[] = {SIG_ENTRY_x_xx(kLocalI32, kLocalI32, kLocalVoid)};
808 FunctionSig* sig =
809 DecodeWasmSignatureForTesting(zone(), data, data + arraysize(data));
810 EXPECT_EQ(nullptr, sig);
811}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000812
Ben Murdochc5610432016-08-08 18:44:38 +0100813class WasmFunctionVerifyTest : public TestWithIsolateAndZone {};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000814
815TEST_F(WasmFunctionVerifyTest, Ok_v_v_empty) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100816 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100817 SIG_ENTRY_v_v, // signature entry
818 4, // locals
819 3,
820 kLocalI32, // --
821 4,
822 kLocalI64, // --
823 5,
824 kLocalF32, // --
825 6,
826 kLocalF64, // --
827 kExprNop // body
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000828 };
829
Ben Murdochc5610432016-08-08 18:44:38 +0100830 FunctionResult result = DecodeWasmFunction(isolate(), zone(), nullptr, data,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000831 data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100832 EXPECT_OK(result);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000833
834 if (result.val && result.ok()) {
835 WasmFunction* function = result.val;
836 EXPECT_EQ(0, function->sig->parameter_count());
837 EXPECT_EQ(0, function->sig->return_count());
838 EXPECT_EQ(0, function->name_offset);
Ben Murdochc5610432016-08-08 18:44:38 +0100839 EXPECT_EQ(SIZEOF_SIG_ENTRY_v_v, function->code_start_offset);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000840 EXPECT_EQ(arraysize(data), function->code_end_offset);
Ben Murdochda12d292016-06-02 14:46:10 +0100841 // TODO(titzer): verify encoding of local declarations
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000842 EXPECT_FALSE(function->exported);
843 }
844
845 if (result.val) delete result.val;
846}
847
Ben Murdochda12d292016-06-02 14:46:10 +0100848TEST_F(WasmModuleVerifyTest, SectionWithoutNameLength) {
849 const byte data[] = {1};
850 EXPECT_FAILURE(data);
851}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000852
Ben Murdochda12d292016-06-02 14:46:10 +0100853TEST_F(WasmModuleVerifyTest, TheLoneliestOfValidModulesTheTrulyEmptyOne) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000854 const byte data[] = {
Ben Murdochda12d292016-06-02 14:46:10 +0100855 0, // Empty section name.
856 // No section name, no content, nothing but sadness.
Ben Murdochc5610432016-08-08 18:44:38 +0100857 0, // No section content.
Ben Murdochda12d292016-06-02 14:46:10 +0100858 };
859 EXPECT_VERIFIES(data);
860}
861
862TEST_F(WasmModuleVerifyTest, OnlyUnknownSectionEmpty) {
863 const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100864 UNKNOWN_SECTION_NAME, 0,
Ben Murdochda12d292016-06-02 14:46:10 +0100865 };
866 EXPECT_VERIFIES(data);
867}
868
869TEST_F(WasmModuleVerifyTest, OnlyUnknownSectionNonEmpty) {
870 const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100871 UNKNOWN_SECTION_NAME,
872 5, // section size
873 0xff,
874 0xff,
875 0xff,
876 0xff,
877 0xff, // section data
Ben Murdochda12d292016-06-02 14:46:10 +0100878 };
879 EXPECT_VERIFIES(data);
880}
881
882TEST_F(WasmModuleVerifyTest, SignatureFollowedByEmptyUnknownSection) {
883 const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100884 // signatures
885 SIGNATURES_SECTION_VOID_VOID,
Ben Murdochda12d292016-06-02 14:46:10 +0100886 // -----------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100887 UNKNOWN_SECTION_NAME,
888 0 // empty section
Ben Murdochda12d292016-06-02 14:46:10 +0100889 };
890 EXPECT_VERIFIES(data);
891}
892
893TEST_F(WasmModuleVerifyTest, SignatureFollowedByUnknownSection) {
894 const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100895 // signatures
896 SIGNATURES_SECTION_VOID_VOID,
Ben Murdochda12d292016-06-02 14:46:10 +0100897 // -----------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100898 UNKNOWN_SECTION_NAME,
899 5, // section size
Ben Murdochda12d292016-06-02 14:46:10 +0100900 0xff, 0xff, 0xff, 0xff, 0xff,
901 };
902 EXPECT_VERIFIES(data);
903}
904
905TEST_F(WasmModuleVerifyTest, SignatureFollowedByUnknownSectionWithLongLEB) {
906 const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100907 // signatures
908 SIGNATURES_SECTION_VOID_VOID,
Ben Murdochda12d292016-06-02 14:46:10 +0100909 // -----------------------------------------------------------
Ben Murdochc5610432016-08-08 18:44:38 +0100910 UNKNOWN_SECTION_NAME, 0x81, 0x80, 0x80, 0x80,
911 0x00, // section size: 1 but in a 5-byte LEB
912 0,
Ben Murdochda12d292016-06-02 14:46:10 +0100913 };
914 EXPECT_VERIFIES(data);
915}
916
917TEST_F(WasmModuleVerifyTest, UnknownSectionOverflow) {
918 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100919 UNKNOWN_EMPTY_SECTION_NAME,
920 9, // section size
921 1,
922 2,
923 3,
924 4,
925 5,
926 6,
927 7,
928 8,
929 9,
930 10, // 10 byte section
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000931 };
932 EXPECT_FAILURE(data);
933}
934
Ben Murdochda12d292016-06-02 14:46:10 +0100935TEST_F(WasmModuleVerifyTest, UnknownSectionUnderflow) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100936 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100937 UNKNOWN_EMPTY_SECTION_NAME,
938 0xff,
939 0xff,
940 0xff,
941 0xff,
942 0x0f, // Section size LEB128 0xffffffff
943 1,
944 2,
945 3,
946 4, // 4 byte section
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000947 };
948 EXPECT_FAILURE(data);
949}
950
Ben Murdochda12d292016-06-02 14:46:10 +0100951TEST_F(WasmModuleVerifyTest, UnknownSectionLoop) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000952 // Would infinite loop decoding if wrapping and allowed.
Ben Murdoch097c5b22016-05-18 11:27:45 +0100953 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100954 UNKNOWN_EMPTY_SECTION_NAME,
955 1,
956 2,
957 3,
958 4, // 4 byte section
959 0xfa,
960 0xff,
961 0xff,
962 0xff,
963 0x0f, // Section size LEB128 0xfffffffa
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000964 };
965 EXPECT_FAILURE(data);
966}
967
Ben Murdochda12d292016-06-02 14:46:10 +0100968TEST_F(WasmModuleVerifyTest, UnknownSectionSkipped) {
969 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100970 UNKNOWN_EMPTY_SECTION_NAME,
971 1, // section size
972 0, // one byte section
973 SECTION(GLOBALS, 4),
Ben Murdochda12d292016-06-02 14:46:10 +0100974 1,
975 0, // name length
976 kMemI32, // memory type
977 0, // exported
978 };
979 ModuleResult result = DecodeModule(data, data + arraysize(data));
Ben Murdochc5610432016-08-08 18:44:38 +0100980 EXPECT_OK(result);
Ben Murdochda12d292016-06-02 14:46:10 +0100981
982 EXPECT_EQ(1, result.val->globals.size());
983 EXPECT_EQ(0, result.val->functions.size());
984 EXPECT_EQ(0, result.val->data_segments.size());
985
986 WasmGlobal* global = &result.val->globals.back();
987
988 EXPECT_EQ(0, global->name_length);
989 EXPECT_EQ(MachineType::Int32(), global->type);
990 EXPECT_EQ(0, global->offset);
991 EXPECT_FALSE(global->exported);
992
993 if (result.val) delete result.val;
994}
995
Ben Murdoch097c5b22016-05-18 11:27:45 +0100996TEST_F(WasmModuleVerifyTest, ImportTable_empty) {
Ben Murdochda12d292016-06-02 14:46:10 +0100997 static const byte data[] = {SECTION(SIGNATURES, 1), 0,
998 SECTION(IMPORT_TABLE, 1), 0};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100999 EXPECT_VERIFIES(data);
1000}
1001
Ben Murdochc5610432016-08-08 18:44:38 +01001002TEST_F(WasmModuleVerifyTest, ImportTable_nosigs1) {
Ben Murdochda12d292016-06-02 14:46:10 +01001003 static const byte data[] = {SECTION(IMPORT_TABLE, 1), 0};
Ben Murdochc5610432016-08-08 18:44:38 +01001004 EXPECT_VERIFIES(data);
1005}
1006
1007TEST_F(WasmModuleVerifyTest, ImportTable_nosigs2) {
1008 static const byte data[] = {
1009 SECTION(IMPORT_TABLE, 6), 1, // sig table
1010 IMPORT_SIG_INDEX(0), // sig index
1011 NAME_LENGTH(1), 'm', // module name
1012 NAME_LENGTH(1), 'f', // function name
1013 };
Ben Murdoch097c5b22016-05-18 11:27:45 +01001014 EXPECT_FAILURE(data);
1015}
1016
1017TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) {
1018 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001019 SECTION(SIGNATURES, 1), 0, // --
1020 SECTION(IMPORT_TABLE, 6), 1, // --
1021 IMPORT_SIG_INDEX(0), // sig index
1022 NAME_LENGTH(1), 'm', // module name
1023 NAME_LENGTH(1), 'f', // function name
Ben Murdoch097c5b22016-05-18 11:27:45 +01001024 };
1025 EXPECT_FAILURE(data);
1026}
1027
1028TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) {
1029 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001030 // signatures
1031 SIGNATURES_SECTION_VOID_VOID,
Ben Murdochda12d292016-06-02 14:46:10 +01001032 SECTION(IMPORT_TABLE, 6),
1033 1, // --
1034 IMPORT_SIG_INDEX(0), // sig index
1035 NAME_LENGTH(1),
1036 'm', // module name
1037 NAME_LENGTH(1),
1038 'f', // function name
Ben Murdoch097c5b22016-05-18 11:27:45 +01001039 };
1040 EXPECT_VERIFIES(data);
1041}
1042
Ben Murdochda12d292016-06-02 14:46:10 +01001043TEST_F(WasmModuleVerifyTest, ImportTable_invalid_module) {
1044 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001045 // signatures
1046 SIGNATURES_SECTION_VOID_VOID,
Ben Murdochda12d292016-06-02 14:46:10 +01001047 SECTION(IMPORT_TABLE, 6),
1048 1, // --
1049 IMPORT_SIG_INDEX(0), // sig index
1050 NO_NAME, // module name
1051 NAME_LENGTH(1),
1052 'f' // function name
1053 };
1054 EXPECT_FAILURE(data);
1055}
1056
Ben Murdoch097c5b22016-05-18 11:27:45 +01001057TEST_F(WasmModuleVerifyTest, ImportTable_off_end) {
1058 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001059 // signatures
1060 SIGNATURES_SECTION_VOID_VOID,
Ben Murdochda12d292016-06-02 14:46:10 +01001061 SECTION(IMPORT_TABLE, 6),
Ben Murdoch097c5b22016-05-18 11:27:45 +01001062 1,
Ben Murdochda12d292016-06-02 14:46:10 +01001063 IMPORT_SIG_INDEX(0), // sig index
1064 NAME_LENGTH(1),
1065 'm', // module name
1066 NAME_LENGTH(1),
1067 'f', // function name
Ben Murdoch097c5b22016-05-18 11:27:45 +01001068 };
1069
Ben Murdochda12d292016-06-02 14:46:10 +01001070 EXPECT_OFF_END_FAILURE(data, 16, sizeof(data));
1071}
1072
1073TEST_F(WasmModuleVerifyTest, ExportTable_empty1) {
Ben Murdochc5610432016-08-08 18:44:38 +01001074 static const byte data[] = {
1075 // signatures
1076 SIGNATURES_SECTION_VOID_VOID,
1077 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION),
1078 1,
1079 EMPTY_FUNCTION(0),
1080 SECTION(EXPORT_TABLE, 1),
1081 0 // --
1082 };
Ben Murdochda12d292016-06-02 14:46:10 +01001083 EXPECT_VERIFIES(data);
1084}
1085
1086TEST_F(WasmModuleVerifyTest, ExportTable_empty2) {
Ben Murdochc5610432016-08-08 18:44:38 +01001087 static const byte data[] = {
1088 SECTION(SIGNATURES, 1), 0, SECTION(OLD_FUNCTIONS, 1), 0,
1089 SECTION(EXPORT_TABLE, 1), 0 // --
1090 };
Ben Murdochda12d292016-06-02 14:46:10 +01001091 // TODO(titzer): current behavior treats empty functions section as missing.
1092 EXPECT_FAILURE(data);
1093}
1094
1095TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions1) {
Ben Murdochc5610432016-08-08 18:44:38 +01001096 static const byte data[] = {
1097 SECTION(SIGNATURES, 1), 0, SECTION(EXPORT_TABLE, 1), 0 // --
1098 };
Ben Murdochda12d292016-06-02 14:46:10 +01001099 EXPECT_FAILURE(data);
1100}
1101
1102TEST_F(WasmModuleVerifyTest, ExportTable_NoFunctions2) {
1103 static const byte data[] = {SECTION(EXPORT_TABLE, 1), 0};
1104 EXPECT_FAILURE(data);
1105}
1106
1107TEST_F(WasmModuleVerifyTest, ExportTableOne) {
1108 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001109 // signatures
1110 SIGNATURES_SECTION_VOID_VOID,
1111 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION),
Ben Murdochda12d292016-06-02 14:46:10 +01001112 1, // functions
1113 EMPTY_FUNCTION(0), // --
Ben Murdochc5610432016-08-08 18:44:38 +01001114 SECTION(EXPORT_TABLE, 3),
Ben Murdochda12d292016-06-02 14:46:10 +01001115 1, // exports
1116 FUNC_INDEX(0), // --
1117 NO_NAME // --
1118 };
1119 EXPECT_VERIFIES(data);
1120}
1121
1122TEST_F(WasmModuleVerifyTest, ExportTableTwo) {
1123 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001124 // signatures
1125 SIGNATURES_SECTION_VOID_VOID,
1126 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION),
Ben Murdochda12d292016-06-02 14:46:10 +01001127 1, // functions
1128 EMPTY_FUNCTION(0), // --
1129 SECTION(EXPORT_TABLE, 12),
1130 2, // exports
1131 FUNC_INDEX(0), // --
1132 NAME_LENGTH(4),
1133 'n',
1134 'a',
1135 'm',
1136 'e', // --
1137 FUNC_INDEX(0), // --
1138 NAME_LENGTH(3),
1139 'n',
1140 'o',
1141 'm' // --
1142 };
1143 EXPECT_VERIFIES(data);
1144}
1145
1146TEST_F(WasmModuleVerifyTest, ExportTableThree) {
1147 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001148 // signatures
1149 SIGNATURES_SECTION_VOID_VOID,
1150 SECTION(OLD_FUNCTIONS, 1 + 3 * SIZEOF_EMPTY_FUNCTION),
Ben Murdochda12d292016-06-02 14:46:10 +01001151 3, // functions
1152 EMPTY_FUNCTION(0), // --
1153 EMPTY_FUNCTION(0), // --
1154 EMPTY_FUNCTION(0), // --
1155 SECTION(EXPORT_TABLE, 10),
1156 3, // exports
1157 FUNC_INDEX(0), // --
1158 NAME_LENGTH(1),
1159 'a', // --
1160 FUNC_INDEX(1), // --
1161 NAME_LENGTH(1),
1162 'b', // --
1163 FUNC_INDEX(2), // --
1164 NAME_LENGTH(1),
1165 'c' // --
1166 };
1167 EXPECT_VERIFIES(data);
1168}
1169
1170TEST_F(WasmModuleVerifyTest, ExportTableThreeOne) {
1171 for (int i = 0; i < 6; i++) {
1172 const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001173 // signatures
1174 SIGNATURES_SECTION_VOID_VOID,
1175 SECTION(OLD_FUNCTIONS, 1 + 3 * SIZEOF_EMPTY_FUNCTION),
Ben Murdochda12d292016-06-02 14:46:10 +01001176 3, // functions
1177 EMPTY_FUNCTION(0), // --
1178 EMPTY_FUNCTION(0), // --
1179 EMPTY_FUNCTION(0), // --
1180 SECTION(EXPORT_TABLE, 5),
1181 1, // exports
1182 FUNC_INDEX(i), // --
1183 NAME_LENGTH(2),
1184 'e',
1185 'x', // --
1186 };
1187
1188 if (i < 3) {
1189 EXPECT_VERIFIES(data);
1190 } else {
1191 EXPECT_FAILURE(data);
1192 }
1193 }
1194}
1195
1196TEST_F(WasmModuleVerifyTest, ExportTableOne_off_end) {
1197 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001198 // signatures
1199 SIGNATURES_SECTION_VOID_VOID,
1200 SECTION(OLD_FUNCTIONS, 1 + SIZEOF_EMPTY_FUNCTION),
Ben Murdochda12d292016-06-02 14:46:10 +01001201 1, // functions
1202 EMPTY_FUNCTION(0), // --
1203 SECTION(EXPORT_TABLE, 1 + 6),
1204 1, // exports
1205 FUNC_INDEX(0), // --
1206 NO_NAME // --
1207 };
1208
1209 for (int length = 33; length < sizeof(data); length++) {
Ben Murdoch097c5b22016-05-18 11:27:45 +01001210 ModuleResult result = DecodeModule(data, data + length);
1211 EXPECT_FALSE(result.ok());
1212 if (result.val) delete result.val;
1213 }
1214}
1215
Ben Murdochda12d292016-06-02 14:46:10 +01001216TEST_F(WasmModuleVerifyTest, FunctionSignatures_empty) {
Ben Murdochc5610432016-08-08 18:44:38 +01001217 static const byte data[] = {
1218 SECTION(SIGNATURES, 1), 0, // --
1219 SECTION(FUNCTION_SIGNATURES, 1), 0 // --
1220 }; // --
Ben Murdochda12d292016-06-02 14:46:10 +01001221 EXPECT_VERIFIES(data);
1222}
1223
1224TEST_F(WasmModuleVerifyTest, FunctionSignatures_one) {
Ben Murdochc5610432016-08-08 18:44:38 +01001225 static const byte data[] = {
1226 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1227 FUNCTION_SIGNATURES_SECTION(1, 0) // --
1228 };
Ben Murdochda12d292016-06-02 14:46:10 +01001229 EXPECT_VERIFIES(data);
1230}
1231
1232TEST_F(WasmModuleVerifyTest, FunctionBodies_empty) {
Ben Murdochc5610432016-08-08 18:44:38 +01001233 static const byte data[] = {
1234 EMPTY_SIGNATURES_SECTION, // --
1235 EMPTY_FUNCTION_SIGNATURES_SECTION, // --
1236 EMPTY_FUNCTION_BODIES_SECTION // --
1237 };
Ben Murdochda12d292016-06-02 14:46:10 +01001238 EXPECT_VERIFIES(data);
1239}
1240
1241TEST_F(WasmModuleVerifyTest, FunctionBodies_one_empty) {
1242 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001243 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1244 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1245 SECTION(FUNCTION_BODIES, 1 + SIZEOF_EMPTY_BODY), 1, EMPTY_BODY // --
1246 };
Ben Murdochda12d292016-06-02 14:46:10 +01001247 EXPECT_VERIFIES(data);
1248}
1249
1250TEST_F(WasmModuleVerifyTest, FunctionBodies_one_nop) {
1251 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001252 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1253 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1254 SECTION(FUNCTION_BODIES, 1 + SIZEOF_NOP_BODY), 1, NOP_BODY // --
1255 };
Ben Murdochda12d292016-06-02 14:46:10 +01001256 EXPECT_VERIFIES(data);
1257}
1258
1259TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch1) {
Ben Murdochc5610432016-08-08 18:44:38 +01001260 static const byte data[] = {
1261 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1262 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // --
1263 SECTION(FUNCTION_BODIES, 1 + SIZEOF_EMPTY_BODY), 1, // --
1264 EMPTY_BODY // --
1265 };
Ben Murdochda12d292016-06-02 14:46:10 +01001266 EXPECT_FAILURE(data);
1267}
1268
1269TEST_F(WasmModuleVerifyTest, FunctionBodies_count_mismatch2) {
Ben Murdochc5610432016-08-08 18:44:38 +01001270 static const byte data[] = {
1271 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1272 FUNCTION_SIGNATURES_SECTION(1, 0), // --
1273 SECTION(FUNCTION_BODIES, 1 + 2 * SIZEOF_NOP_BODY), // --
1274 2, // --
1275 NOP_BODY, // --
1276 NOP_BODY // --
1277 };
Ben Murdochda12d292016-06-02 14:46:10 +01001278 EXPECT_FAILURE(data);
1279}
1280
1281TEST_F(WasmModuleVerifyTest, Names_empty) {
1282 static const byte data[] = {
1283 EMPTY_SIGNATURES_SECTION, EMPTY_FUNCTION_SIGNATURES_SECTION,
1284 EMPTY_FUNCTION_BODIES_SECTION, EMPTY_NAMES_SECTION};
1285 EXPECT_VERIFIES(data);
1286}
1287
1288TEST_F(WasmModuleVerifyTest, Names_one_empty) {
1289 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001290 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
Ben Murdochda12d292016-06-02 14:46:10 +01001291 FUNCTION_SIGNATURES_SECTION(1, 0), // --
Ben Murdochc5610432016-08-08 18:44:38 +01001292 SECTION(FUNCTION_BODIES, 1 + SIZEOF_EMPTY_BODY),
Ben Murdochda12d292016-06-02 14:46:10 +01001293 1,
1294 EMPTY_BODY, // --
1295 SECTION(NAMES, 1 + 5),
1296 1,
1297 FOO_STRING,
1298 NO_LOCAL_NAMES // --
1299 };
1300 EXPECT_VERIFIES(data);
1301}
1302
1303TEST_F(WasmModuleVerifyTest, Names_two_empty) {
1304 static const byte data[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001305 SIGNATURES_SECTION(1, SIG_ENTRY_v_v), // --
1306 FUNCTION_SIGNATURES_SECTION(2, 0, 0), // --
1307 SECTION(FUNCTION_BODIES, 1 + 2 * SIZEOF_EMPTY_BODY), // --
Ben Murdochda12d292016-06-02 14:46:10 +01001308 2,
1309 EMPTY_BODY,
1310 EMPTY_BODY, // --
1311 SECTION(NAMES, 1 + 10),
1312 2, // --
1313 FOO_STRING,
1314 NO_LOCAL_NAMES, // --
1315 FOO_STRING,
1316 NO_LOCAL_NAMES, // --
1317 };
1318 EXPECT_VERIFIES(data);
1319}
1320
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001321} // namespace wasm
1322} // namespace internal
1323} // namespace v8