OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/decoder.h" | 7 #include "src/wasm/decoder.h" |
8 #include "src/wasm/wasm-macro-gen.h" | 8 #include "src/wasm/wasm-macro-gen.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
11 namespace internal { | 11 namespace internal { |
12 namespace wasm { | 12 namespace wasm { |
13 | 13 |
14 class DecoderTest : public TestWithZone { | 14 class DecoderTest : public TestWithZone { |
15 public: | 15 public: |
16 DecoderTest() : decoder(nullptr, nullptr) {} | 16 DecoderTest() : decoder(nullptr, nullptr) {} |
17 | 17 |
18 Decoder decoder; | 18 Decoder decoder; |
19 }; | 19 }; |
20 | 20 |
21 #define CHECK_UINT32V_INLINE(expected, expected_length, ...) \ | 21 #define CHECK_UINT32V_INLINE(expected, expected_length, ...) \ |
22 do { \ | 22 do { \ |
23 const byte data[] = {__VA_ARGS__}; \ | 23 const byte data[] = {__VA_ARGS__}; \ |
24 decoder.Reset(data, data + sizeof(data)); \ | 24 decoder.Reset(data, data + sizeof(data)); \ |
25 int length; \ | 25 unsigned length; \ |
26 EXPECT_EQ(expected, \ | 26 EXPECT_EQ(expected, \ |
27 decoder.checked_read_u32v(decoder.start(), 0, &length)); \ | 27 decoder.checked_read_u32v(decoder.start(), 0, &length)); \ |
28 EXPECT_EQ(expected_length, length); \ | 28 EXPECT_EQ(expected_length, length); \ |
29 } while (false) | 29 } while (false) |
30 | 30 |
31 #define CHECK_INT32V_INLINE(expected, expected_length, ...) \ | 31 #define CHECK_INT32V_INLINE(expected, expected_length, ...) \ |
32 do { \ | 32 do { \ |
33 const byte data[] = {__VA_ARGS__}; \ | 33 const byte data[] = {__VA_ARGS__}; \ |
34 decoder.Reset(data, data + sizeof(data)); \ | 34 decoder.Reset(data, data + sizeof(data)); \ |
35 int length; \ | 35 unsigned length; \ |
36 EXPECT_EQ(expected, \ | 36 EXPECT_EQ(expected, \ |
37 decoder.checked_read_i32v(decoder.start(), 0, &length)); \ | 37 decoder.checked_read_i32v(decoder.start(), 0, &length)); \ |
38 EXPECT_EQ(expected_length, length); \ | 38 EXPECT_EQ(expected_length, length); \ |
39 } while (false) | 39 } while (false) |
40 | 40 |
41 #define CHECK_UINT64V_INLINE(expected, expected_length, ...) \ | 41 #define CHECK_UINT64V_INLINE(expected, expected_length, ...) \ |
42 do { \ | 42 do { \ |
43 const byte data[] = {__VA_ARGS__}; \ | 43 const byte data[] = {__VA_ARGS__}; \ |
44 decoder.Reset(data, data + sizeof(data)); \ | 44 decoder.Reset(data, data + sizeof(data)); \ |
45 int length; \ | 45 unsigned length; \ |
46 EXPECT_EQ(expected, \ | 46 EXPECT_EQ(expected, \ |
47 decoder.checked_read_u64v(decoder.start(), 0, &length)); \ | 47 decoder.checked_read_u64v(decoder.start(), 0, &length)); \ |
48 EXPECT_EQ(expected_length, length); \ | 48 EXPECT_EQ(expected_length, length); \ |
49 } while (false) | 49 } while (false) |
50 | 50 |
51 #define CHECK_INT64V_INLINE(expected, expected_length, ...) \ | 51 #define CHECK_INT64V_INLINE(expected, expected_length, ...) \ |
52 do { \ | 52 do { \ |
53 const byte data[] = {__VA_ARGS__}; \ | 53 const byte data[] = {__VA_ARGS__}; \ |
54 decoder.Reset(data, data + sizeof(data)); \ | 54 decoder.Reset(data, data + sizeof(data)); \ |
55 int length; \ | 55 unsigned length; \ |
56 EXPECT_EQ(expected, \ | 56 EXPECT_EQ(expected, \ |
57 decoder.checked_read_i64v(decoder.start(), 0, &length)); \ | 57 decoder.checked_read_i64v(decoder.start(), 0, &length)); \ |
58 EXPECT_EQ(expected_length, length); \ | 58 EXPECT_EQ(expected_length, length); \ |
59 } while (false) | 59 } while (false) |
60 | 60 |
61 TEST_F(DecoderTest, ReadU32v_OneByte) { | 61 TEST_F(DecoderTest, ReadU32v_OneByte) { |
62 CHECK_UINT32V_INLINE(0, 1, 0); | 62 CHECK_UINT32V_INLINE(0, 1, 0); |
63 CHECK_UINT32V_INLINE(5, 1, 5); | 63 CHECK_UINT32V_INLINE(5, 1, 5); |
64 CHECK_UINT32V_INLINE(7, 1, 7); | 64 CHECK_UINT32V_INLINE(7, 1, 7); |
65 CHECK_UINT32V_INLINE(9, 1, 9); | 65 CHECK_UINT32V_INLINE(9, 1, 9); |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 } | 358 } |
359 | 359 |
360 const int32_t max = kMaxInt; | 360 const int32_t max = kMaxInt; |
361 for (int i = max; i > max - 10; i--) { | 361 for (int i = max; i > max - 10; i--) { |
362 CHECK_INT32V_INLINE(i, 5, U32V_5(i)); | 362 CHECK_INT32V_INLINE(i, 5, U32V_5(i)); |
363 } | 363 } |
364 } | 364 } |
365 | 365 |
366 TEST_F(DecoderTest, ReadU32v_off_end1) { | 366 TEST_F(DecoderTest, ReadU32v_off_end1) { |
367 static const byte data[] = {U32V_1(11)}; | 367 static const byte data[] = {U32V_1(11)}; |
368 int length = 0; | 368 unsigned length = 0; |
369 decoder.Reset(data, data); | 369 decoder.Reset(data, data); |
370 decoder.checked_read_u32v(decoder.start(), 0, &length); | 370 decoder.checked_read_u32v(decoder.start(), 0, &length); |
371 EXPECT_EQ(0, length); | 371 EXPECT_EQ(0, length); |
372 EXPECT_FALSE(decoder.ok()); | 372 EXPECT_FALSE(decoder.ok()); |
373 } | 373 } |
374 | 374 |
375 TEST_F(DecoderTest, ReadU32v_off_end2) { | 375 TEST_F(DecoderTest, ReadU32v_off_end2) { |
376 static const byte data[] = {U32V_2(1111)}; | 376 static const byte data[] = {U32V_2(1111)}; |
377 for (size_t i = 0; i < sizeof(data); i++) { | 377 for (size_t i = 0; i < sizeof(data); i++) { |
378 int length = 0; | 378 unsigned length = 0; |
379 decoder.Reset(data, data + i); | 379 decoder.Reset(data, data + i); |
380 decoder.checked_read_u32v(decoder.start(), 0, &length); | 380 decoder.checked_read_u32v(decoder.start(), 0, &length); |
381 EXPECT_EQ(i, length); | 381 EXPECT_EQ(i, length); |
382 EXPECT_FALSE(decoder.ok()); | 382 EXPECT_FALSE(decoder.ok()); |
383 } | 383 } |
384 } | 384 } |
385 | 385 |
386 TEST_F(DecoderTest, ReadU32v_off_end3) { | 386 TEST_F(DecoderTest, ReadU32v_off_end3) { |
387 static const byte data[] = {U32V_3(111111)}; | 387 static const byte data[] = {U32V_3(111111)}; |
388 for (size_t i = 0; i < sizeof(data); i++) { | 388 for (size_t i = 0; i < sizeof(data); i++) { |
389 int length = 0; | 389 unsigned length = 0; |
390 decoder.Reset(data, data + i); | 390 decoder.Reset(data, data + i); |
391 decoder.checked_read_u32v(decoder.start(), 0, &length); | 391 decoder.checked_read_u32v(decoder.start(), 0, &length); |
392 EXPECT_EQ(i, length); | 392 EXPECT_EQ(i, length); |
393 EXPECT_FALSE(decoder.ok()); | 393 EXPECT_FALSE(decoder.ok()); |
394 } | 394 } |
395 } | 395 } |
396 | 396 |
397 TEST_F(DecoderTest, ReadU32v_off_end4) { | 397 TEST_F(DecoderTest, ReadU32v_off_end4) { |
398 static const byte data[] = {U32V_4(11111111)}; | 398 static const byte data[] = {U32V_4(11111111)}; |
399 for (size_t i = 0; i < sizeof(data); i++) { | 399 for (size_t i = 0; i < sizeof(data); i++) { |
400 int length = 0; | 400 unsigned length = 0; |
401 decoder.Reset(data, data + i); | 401 decoder.Reset(data, data + i); |
402 decoder.checked_read_u32v(decoder.start(), 0, &length); | 402 decoder.checked_read_u32v(decoder.start(), 0, &length); |
403 EXPECT_EQ(i, length); | 403 EXPECT_EQ(i, length); |
404 EXPECT_FALSE(decoder.ok()); | 404 EXPECT_FALSE(decoder.ok()); |
405 } | 405 } |
406 } | 406 } |
407 | 407 |
408 TEST_F(DecoderTest, ReadU32v_off_end5) { | 408 TEST_F(DecoderTest, ReadU32v_off_end5) { |
409 static const byte data[] = {U32V_5(111111111)}; | 409 static const byte data[] = {U32V_5(111111111)}; |
410 for (size_t i = 0; i < sizeof(data); i++) { | 410 for (size_t i = 0; i < sizeof(data); i++) { |
411 int length = 0; | 411 unsigned length = 0; |
412 decoder.Reset(data, data + i); | 412 decoder.Reset(data, data + i); |
413 decoder.checked_read_u32v(decoder.start(), 0, &length); | 413 decoder.checked_read_u32v(decoder.start(), 0, &length); |
414 EXPECT_EQ(i, length); | 414 EXPECT_EQ(i, length); |
415 EXPECT_FALSE(decoder.ok()); | 415 EXPECT_FALSE(decoder.ok()); |
416 } | 416 } |
417 } | 417 } |
418 | 418 |
419 TEST_F(DecoderTest, ReadU32v_extra_bits) { | 419 TEST_F(DecoderTest, ReadU32v_extra_bits) { |
420 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x00}; | 420 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x00}; |
421 for (int i = 1; i < 16; i++) { | 421 for (int i = 1; i < 16; i++) { |
422 data[4] = static_cast<byte>(i << 4); | 422 data[4] = static_cast<byte>(i << 4); |
423 int length = 0; | 423 unsigned length = 0; |
424 decoder.Reset(data, data + sizeof(data)); | 424 decoder.Reset(data, data + sizeof(data)); |
425 decoder.checked_read_u32v(decoder.start(), 0, &length); | 425 decoder.checked_read_u32v(decoder.start(), 0, &length); |
426 EXPECT_EQ(5, length); | 426 EXPECT_EQ(5, length); |
427 EXPECT_FALSE(decoder.ok()); | 427 EXPECT_FALSE(decoder.ok()); |
428 } | 428 } |
429 } | 429 } |
430 | 430 |
431 TEST_F(DecoderTest, ReadI32v_extra_bits_negative) { | 431 TEST_F(DecoderTest, ReadI32v_extra_bits_negative) { |
432 // OK for negative signed values to have extra ones. | 432 // OK for negative signed values to have extra ones. |
433 int length = 0; | 433 unsigned length = 0; |
434 byte data[] = {0xff, 0xff, 0xff, 0xff, 0x7f}; | 434 byte data[] = {0xff, 0xff, 0xff, 0xff, 0x7f}; |
435 decoder.Reset(data, data + sizeof(data)); | 435 decoder.Reset(data, data + sizeof(data)); |
436 decoder.checked_read_i32v(decoder.start(), 0, &length); | 436 decoder.checked_read_i32v(decoder.start(), 0, &length); |
437 EXPECT_EQ(5, length); | 437 EXPECT_EQ(5, length); |
438 EXPECT_TRUE(decoder.ok()); | 438 EXPECT_TRUE(decoder.ok()); |
439 } | 439 } |
440 | 440 |
441 TEST_F(DecoderTest, ReadI32v_extra_bits_positive) { | 441 TEST_F(DecoderTest, ReadI32v_extra_bits_positive) { |
442 // Not OK for positive signed values to have extra ones. | 442 // Not OK for positive signed values to have extra ones. |
443 int length = 0; | 443 unsigned length = 0; |
444 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x77}; | 444 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x77}; |
445 decoder.Reset(data, data + sizeof(data)); | 445 decoder.Reset(data, data + sizeof(data)); |
446 decoder.checked_read_i32v(decoder.start(), 0, &length); | 446 decoder.checked_read_i32v(decoder.start(), 0, &length); |
447 EXPECT_EQ(5, length); | 447 EXPECT_EQ(5, length); |
448 EXPECT_FALSE(decoder.ok()); | 448 EXPECT_FALSE(decoder.ok()); |
449 } | 449 } |
450 | 450 |
451 TEST_F(DecoderTest, ReadU32v_Bits) { | 451 TEST_F(DecoderTest, ReadU32v_Bits) { |
452 // A more exhaustive test. | 452 // A more exhaustive test. |
453 const int kMaxSize = 5; | 453 const int kMaxSize = 5; |
(...skipping 16 matching lines...) Expand all Loading... |
470 for (int j = 0; j < kMaxSize; j++) { | 470 for (int j = 0; j < kMaxSize; j++) { |
471 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); | 471 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); |
472 } | 472 } |
473 for (int j = 0; j < length - 1; j++) { | 473 for (int j = 0; j < length - 1; j++) { |
474 data[j] |= 0x80; | 474 data[j] |= 0x80; |
475 } | 475 } |
476 | 476 |
477 // foreach buffer size 0...5 | 477 // foreach buffer size 0...5 |
478 for (int limit = 0; limit <= kMaxSize; limit++) { | 478 for (int limit = 0; limit <= kMaxSize; limit++) { |
479 decoder.Reset(data, data + limit); | 479 decoder.Reset(data, data + limit); |
480 int rlen; | 480 unsigned rlen; |
481 uint32_t result = decoder.checked_read_u32v(data, 0, &rlen); | 481 uint32_t result = decoder.checked_read_u32v(data, 0, &rlen); |
482 if (limit < length) { | 482 if (limit < length) { |
483 EXPECT_FALSE(decoder.ok()); | 483 EXPECT_FALSE(decoder.ok()); |
484 } else { | 484 } else { |
485 EXPECT_TRUE(decoder.ok()); | 485 EXPECT_TRUE(decoder.ok()); |
486 EXPECT_EQ(val, result); | 486 EXPECT_EQ(val, result); |
487 EXPECT_EQ(length, rlen); | 487 EXPECT_EQ(length, rlen); |
488 } | 488 } |
489 } | 489 } |
490 } | 490 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 byte data[kMaxSize]; | 526 byte data[kMaxSize]; |
527 | 527 |
528 for (int i = 0; i < 64; i++) { | 528 for (int i = 0; i < 64; i++) { |
529 const uint64_t val = 1ull << i; | 529 const uint64_t val = 1ull << i; |
530 int index = i / 7; | 530 int index = i / 7; |
531 data[index] = 1 << (i % 7); | 531 data[index] = 1 << (i % 7); |
532 memset(data, 0x80, index); | 532 memset(data, 0x80, index); |
533 | 533 |
534 for (int limit = 0; limit <= kMaxSize; limit++) { | 534 for (int limit = 0; limit <= kMaxSize; limit++) { |
535 decoder.Reset(data, data + limit); | 535 decoder.Reset(data, data + limit); |
536 int length; | 536 unsigned length; |
537 uint64_t result = decoder.checked_read_u64v(data, 0, &length); | 537 uint64_t result = decoder.checked_read_u64v(data, 0, &length); |
538 if (limit <= index) { | 538 if (limit <= index) { |
539 EXPECT_FALSE(decoder.ok()); | 539 EXPECT_FALSE(decoder.ok()); |
540 } else { | 540 } else { |
541 EXPECT_TRUE(decoder.ok()); | 541 EXPECT_TRUE(decoder.ok()); |
542 EXPECT_EQ(val, result); | 542 EXPECT_EQ(val, result); |
543 EXPECT_EQ(index + 1, length); | 543 EXPECT_EQ(index + 1, length); |
544 } | 544 } |
545 } | 545 } |
546 } | 546 } |
(...skipping 20 matching lines...) Expand all Loading... |
567 for (int j = 0; j < kMaxSize; j++) { | 567 for (int j = 0; j < kMaxSize; j++) { |
568 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); | 568 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); |
569 } | 569 } |
570 for (int j = 0; j < length - 1; j++) { | 570 for (int j = 0; j < length - 1; j++) { |
571 data[j] |= 0x80; | 571 data[j] |= 0x80; |
572 } | 572 } |
573 | 573 |
574 // foreach buffer size 0...10 | 574 // foreach buffer size 0...10 |
575 for (int limit = 0; limit <= kMaxSize; limit++) { | 575 for (int limit = 0; limit <= kMaxSize; limit++) { |
576 decoder.Reset(data, data + limit); | 576 decoder.Reset(data, data + limit); |
577 int rlen; | 577 unsigned rlen; |
578 uint64_t result = decoder.checked_read_u64v(data, 0, &rlen); | 578 uint64_t result = decoder.checked_read_u64v(data, 0, &rlen); |
579 if (limit < length) { | 579 if (limit < length) { |
580 EXPECT_FALSE(decoder.ok()); | 580 EXPECT_FALSE(decoder.ok()); |
581 } else { | 581 } else { |
582 EXPECT_TRUE(decoder.ok()); | 582 EXPECT_TRUE(decoder.ok()); |
583 EXPECT_EQ(val, result); | 583 EXPECT_EQ(val, result); |
584 EXPECT_EQ(length, rlen); | 584 EXPECT_EQ(length, rlen); |
585 } | 585 } |
586 } | 586 } |
587 } | 587 } |
(...skipping 21 matching lines...) Expand all Loading... |
609 for (int j = 0; j < kMaxSize; j++) { | 609 for (int j = 0; j < kMaxSize; j++) { |
610 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); | 610 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); |
611 } | 611 } |
612 for (int j = 0; j < length - 1; j++) { | 612 for (int j = 0; j < length - 1; j++) { |
613 data[j] |= 0x80; | 613 data[j] |= 0x80; |
614 } | 614 } |
615 | 615 |
616 // foreach buffer size 0...10 | 616 // foreach buffer size 0...10 |
617 for (int limit = 0; limit <= kMaxSize; limit++) { | 617 for (int limit = 0; limit <= kMaxSize; limit++) { |
618 decoder.Reset(data, data + limit); | 618 decoder.Reset(data, data + limit); |
619 int rlen; | 619 unsigned rlen; |
620 int64_t result = decoder.checked_read_i64v(data, 0, &rlen); | 620 int64_t result = decoder.checked_read_i64v(data, 0, &rlen); |
621 if (limit < length) { | 621 if (limit < length) { |
622 EXPECT_FALSE(decoder.ok()); | 622 EXPECT_FALSE(decoder.ok()); |
623 } else { | 623 } else { |
624 EXPECT_TRUE(decoder.ok()); | 624 EXPECT_TRUE(decoder.ok()); |
625 EXPECT_EQ(val, result); | 625 EXPECT_EQ(val, result); |
626 EXPECT_EQ(length, rlen); | 626 EXPECT_EQ(length, rlen); |
627 } | 627 } |
628 } | 628 } |
629 } | 629 } |
630 } | 630 } |
631 } | 631 } |
632 | 632 |
633 TEST_F(DecoderTest, ReadU64v_extra_bits) { | 633 TEST_F(DecoderTest, ReadU64v_extra_bits) { |
634 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00}; | 634 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00}; |
635 for (int i = 1; i < 128; i++) { | 635 for (int i = 1; i < 128; i++) { |
636 data[9] = static_cast<byte>(i << 1); | 636 data[9] = static_cast<byte>(i << 1); |
637 int length = 0; | 637 unsigned length = 0; |
638 decoder.Reset(data, data + sizeof(data)); | 638 decoder.Reset(data, data + sizeof(data)); |
639 decoder.checked_read_u64v(decoder.start(), 0, &length); | 639 decoder.checked_read_u64v(decoder.start(), 0, &length); |
640 EXPECT_EQ(10, length); | 640 EXPECT_EQ(10, length); |
641 EXPECT_FALSE(decoder.ok()); | 641 EXPECT_FALSE(decoder.ok()); |
642 } | 642 } |
643 } | 643 } |
644 | 644 |
645 TEST_F(DecoderTest, ReadI64v_extra_bits_negative) { | 645 TEST_F(DecoderTest, ReadI64v_extra_bits_negative) { |
646 // OK for negative signed values to have extra ones. | 646 // OK for negative signed values to have extra ones. |
647 int length = 0; | 647 unsigned length = 0; |
648 byte data[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}; | 648 byte data[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}; |
649 decoder.Reset(data, data + sizeof(data)); | 649 decoder.Reset(data, data + sizeof(data)); |
650 decoder.checked_read_i64v(decoder.start(), 0, &length); | 650 decoder.checked_read_i64v(decoder.start(), 0, &length); |
651 EXPECT_EQ(10, length); | 651 EXPECT_EQ(10, length); |
652 EXPECT_TRUE(decoder.ok()); | 652 EXPECT_TRUE(decoder.ok()); |
653 } | 653 } |
654 | 654 |
655 TEST_F(DecoderTest, ReadI64v_extra_bits_positive) { | 655 TEST_F(DecoderTest, ReadI64v_extra_bits_positive) { |
656 // Not OK for positive signed values to have extra ones. | 656 // Not OK for positive signed values to have extra ones. |
657 int length = 0; | 657 unsigned length = 0; |
658 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x77}; | 658 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x77}; |
659 decoder.Reset(data, data + sizeof(data)); | 659 decoder.Reset(data, data + sizeof(data)); |
660 decoder.checked_read_i64v(decoder.start(), 0, &length); | 660 decoder.checked_read_i64v(decoder.start(), 0, &length); |
661 EXPECT_EQ(10, length); | 661 EXPECT_EQ(10, length); |
662 EXPECT_FALSE(decoder.ok()); | 662 EXPECT_FALSE(decoder.ok()); |
663 } | 663 } |
664 | 664 |
665 } // namespace wasm | 665 } // namespace wasm |
666 } // namespace internal | 666 } // namespace internal |
667 } // namespace v8 | 667 } // namespace v8 |
OLD | NEW |