Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: syzygy/agent/asan/rtl_unittest.cc

Issue 2321423002: Merge the latest changes to master in the vs2015 branch. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « syzygy/agent/asan/memory_interceptors.h ('k') | syzygy/agent/asan/syzyasan_rtl.def.template » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 Google Inc. All Rights Reserved. 1 // Copyright 2012 Google Inc. All Rights Reserved.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License. 4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 false, &dst[0], &src[memory_length_], 0xDEADDEAD, HEAP_BUFFER_OVERFLOW); 459 false, &dst[0], &src[memory_length_], 0xDEADDEAD, HEAP_BUFFER_OVERFLOW);
460 tester.ExpectSpecialMemoryErrorIsDetected( 460 tester.ExpectSpecialMemoryErrorIsDetected(
461 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD, 461 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD,
462 true, &dst[memory_length_], &src[0], 0xDEADDEAD, HEAP_BUFFER_OVERFLOW); 462 true, &dst[memory_length_], &src[0], 0xDEADDEAD, HEAP_BUFFER_OVERFLOW);
463 } 463 }
464 464
465 FreeMemoryBuffers(); 465 FreeMemoryBuffers();
466 } 466 }
467 467
468 TEST_F(AsanRtlTest, AsanPrefixedSpecialInstructionCheckGoodAccess) { 468 TEST_F(AsanRtlTest, AsanPrefixedSpecialInstructionCheckGoodAccess) {
469 static const char* function_names[] = { 469 static const char* function_names[] = {"asan_check_repz_4_byte_lods_access",
470 "asan_check_repz_4_byte_movs_access", 470 "asan_check_repz_4_byte_movs_access",
471 "asan_check_repz_4_byte_cmps_access", 471 "asan_check_repz_4_byte_cmps_access",
472 "asan_check_repz_4_byte_stos_access" 472 "asan_check_repz_4_byte_stos_access"};
473 };
474 473
475 // Allocate memory space. 474 // Allocate memory space.
476 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t)); 475 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t));
477 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_); 476 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_);
478 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_); 477 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_);
479 478
480 // Validate memory accesses. 479 // Validate memory accesses.
481 for (int32_t function = 0; function < arraysize(function_names); ++function) { 480 for (int32_t function = 0; function < arraysize(function_names); ++function) {
482 FARPROC check_access_fn = 481 FARPROC check_access_fn =
483 ::GetProcAddress(asan_rtl_, function_names[function]); 482 ::GetProcAddress(asan_rtl_, function_names[function]);
484 ASSERT_TRUE(check_access_fn != NULL); 483 ASSERT_TRUE(check_access_fn != NULL);
485 484
486 MemoryAccessorTester tester; 485 MemoryAccessorTester tester;
487 tester.ExpectSpecialMemoryErrorIsDetected( 486 tester.ExpectSpecialMemoryErrorIsDetected(
488 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD, 487 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD,
489 false, &dst[0], &src[0], memory_length_, UNKNOWN_BAD_ACCESS); 488 false, &dst[0], &src[0], memory_length_, UNKNOWN_BAD_ACCESS);
490 } 489 }
491 490
492 FreeMemoryBuffers(); 491 FreeMemoryBuffers();
493 } 492 }
494 493
495 TEST_F(AsanRtlTest, AsanPrefixedSpecialInstructionCheckBadAccess) { 494 TEST_F(AsanRtlTest, AsanPrefixedSpecialInstructionCheckBadAccess) {
496 static const char* function_names[] = { 495 static const char* function_names[] = {"asan_check_repz_4_byte_lods_access",
497 "asan_check_repz_4_byte_movs_access", 496 "asan_check_repz_4_byte_movs_access",
498 "asan_check_repz_4_byte_cmps_access", 497 "asan_check_repz_4_byte_cmps_access",
499 "asan_check_repz_4_byte_stos_access" 498 "asan_check_repz_4_byte_stos_access"};
500 };
501 499
502 // Allocate memory space. 500 // Allocate memory space.
503 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t)); 501 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t));
504 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_); 502 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_);
505 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_); 503 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_);
506 504
507 // Validate memory accesses. 505 // Validate memory accesses.
508 for (int32_t function = 0; function < arraysize(function_names); ++function) { 506 for (int32_t function = 0; function < arraysize(function_names); ++function) {
509 FARPROC check_access_fn = 507 FARPROC check_access_fn =
510 ::GetProcAddress(asan_rtl_, function_names[function]); 508 ::GetProcAddress(asan_rtl_, function_names[function]);
511 ASSERT_TRUE(check_access_fn != NULL); 509 ASSERT_TRUE(check_access_fn != NULL);
512 510
513 MemoryAccessorTester tester; 511 MemoryAccessorTester tester;
514 tester.ExpectSpecialMemoryErrorIsDetected( 512 tester.ExpectSpecialMemoryErrorIsDetected(
515 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD, 513 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD,
516 true, &dst[0], &src[0], memory_length_ + 1, HEAP_BUFFER_OVERFLOW); 514 true, &dst[0], &src[0], memory_length_ + 1, HEAP_BUFFER_OVERFLOW);
517 tester.ExpectSpecialMemoryErrorIsDetected( 515 tester.ExpectSpecialMemoryErrorIsDetected(
518 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD, 516 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD,
519 true, &dst[-1], &src[-1], memory_length_, HEAP_BUFFER_UNDERFLOW); 517 true, &dst[-1], &src[-1], memory_length_, HEAP_BUFFER_UNDERFLOW);
520 tester.ExpectSpecialMemoryErrorIsDetected( 518 tester.ExpectSpecialMemoryErrorIsDetected(
521 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD, 519 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD,
522 true, &dst[-1], &src[0], memory_length_, HEAP_BUFFER_UNDERFLOW); 520 true, &dst[-1], &src[0], memory_length_, HEAP_BUFFER_UNDERFLOW);
523 } 521 }
524 522
525 FreeMemoryBuffers(); 523 FreeMemoryBuffers();
526 } 524 }
527 525
528 TEST_F(AsanRtlTest, AsanDirectionSpecialInstructionCheckGoodAccess) { 526 TEST_F(AsanRtlTest, AsanDirectionSpecialInstructionCheckGoodAccess) {
529 static const char* function_names[] = { 527 static const char* function_names[] = {"asan_check_repz_4_byte_lods_access",
530 "asan_check_repz_4_byte_movs_access", 528 "asan_check_repz_4_byte_movs_access",
531 "asan_check_repz_4_byte_cmps_access", 529 "asan_check_repz_4_byte_cmps_access",
532 "asan_check_repz_4_byte_stos_access" 530 "asan_check_repz_4_byte_stos_access"};
533 };
534 531
535 // Allocate memory space. 532 // Allocate memory space.
536 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t)); 533 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t));
537 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_); 534 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_);
538 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_); 535 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_);
539 536
540 // Validate memory accesses. 537 // Validate memory accesses.
541 for (int32_t function = 0; function < arraysize(function_names); ++function) { 538 for (int32_t function = 0; function < arraysize(function_names); ++function) {
542 FARPROC check_access_fn = 539 FARPROC check_access_fn =
543 ::GetProcAddress(asan_rtl_, function_names[function]); 540 ::GetProcAddress(asan_rtl_, function_names[function]);
544 ASSERT_TRUE(check_access_fn != NULL); 541 ASSERT_TRUE(check_access_fn != NULL);
545 542
546 MemoryAccessorTester tester; 543 MemoryAccessorTester tester;
547 tester.ExpectSpecialMemoryErrorIsDetected( 544 tester.ExpectSpecialMemoryErrorIsDetected(
548 check_access_fn, MemoryAccessorTester::DIRECTION_BACKWARD, 545 check_access_fn, MemoryAccessorTester::DIRECTION_BACKWARD,
549 false, &dst[memory_length_ - 1], 546 false, &dst[memory_length_ - 1],
550 &src[memory_length_ - 1], memory_length_, 547 &src[memory_length_ - 1], memory_length_,
551 UNKNOWN_BAD_ACCESS); 548 UNKNOWN_BAD_ACCESS);
552 } 549 }
553 550
554 FreeMemoryBuffers(); 551 FreeMemoryBuffers();
555 } 552 }
556 553
557 TEST_F(AsanRtlTest, AsanSpecialInstructionCheckZeroAccess) { 554 TEST_F(AsanRtlTest, AsanSpecialInstructionCheckZeroAccess) {
558 static const char* function_names[] = { 555 static const char* function_names[] = {"asan_check_repz_1_byte_lods_access",
559 "asan_check_repz_1_byte_movs_access", 556 "asan_check_repz_1_byte_movs_access",
560 "asan_check_repz_1_byte_cmps_access", 557 "asan_check_repz_1_byte_cmps_access",
561 "asan_check_repz_1_byte_stos_access", 558 "asan_check_repz_1_byte_stos_access",
562 "asan_check_repz_2_byte_movs_access", 559 "asan_check_repz_2_byte_lods_access",
563 "asan_check_repz_2_byte_cmps_access", 560 "asan_check_repz_2_byte_movs_access",
564 "asan_check_repz_2_byte_stos_access", 561 "asan_check_repz_2_byte_cmps_access",
565 "asan_check_repz_4_byte_movs_access", 562 "asan_check_repz_2_byte_stos_access",
566 "asan_check_repz_4_byte_cmps_access", 563 "asan_check_repz_4_byte_lods_access",
567 "asan_check_repz_4_byte_stos_access" 564 "asan_check_repz_4_byte_movs_access",
568 }; 565 "asan_check_repz_4_byte_cmps_access",
566 "asan_check_repz_4_byte_stos_access"};
569 567
570 // Allocate memory space. 568 // Allocate memory space.
571 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t)); 569 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t));
572 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_); 570 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_);
573 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_); 571 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_);
574 572
575 // Validate memory accesses. 573 // Validate memory accesses.
576 for (int32_t function = 0; function < arraysize(function_names); ++function) { 574 for (int32_t function = 0; function < arraysize(function_names); ++function) {
577 FARPROC check_access_fn = 575 FARPROC check_access_fn =
578 ::GetProcAddress(asan_rtl_, function_names[function]); 576 ::GetProcAddress(asan_rtl_, function_names[function]);
579 ASSERT_TRUE(check_access_fn != NULL); 577 ASSERT_TRUE(check_access_fn != NULL);
580 578
581 // A prefixed instruction with a count of zero do not have side effects. 579 // A prefixed instruction with a count of zero do not have side effects.
582 MemoryAccessorTester tester; 580 MemoryAccessorTester tester;
583 tester.ExpectSpecialMemoryErrorIsDetected( 581 tester.ExpectSpecialMemoryErrorIsDetected(
584 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD, 582 check_access_fn, MemoryAccessorTester::DIRECTION_FORWARD,
585 false, &dst[-1], &src[-1], 0, UNKNOWN_BAD_ACCESS); 583 false, &dst[-1], &src[-1], 0, UNKNOWN_BAD_ACCESS);
586 } 584 }
587 585
588 FreeMemoryBuffers(); 586 FreeMemoryBuffers();
589 } 587 }
590 588
591 TEST_F(AsanRtlTest, AsanSpecialInstructionCheckShortcutAccess) { 589 TEST_F(AsanRtlTest, AsanSpecialInstructionCheckShortcutAccess) {
592 static const char* function_names[] = { 590 static const char* function_names[] = {
591 "asan_check_repz_1_byte_lods_access",
593 "asan_check_repz_1_byte_cmps_access", 592 "asan_check_repz_1_byte_cmps_access",
594 "asan_check_repz_2_byte_cmps_access", 593 "asan_check_repz_2_byte_cmps_access",
595 "asan_check_repz_4_byte_cmps_access", 594 "asan_check_repz_4_byte_cmps_access",
596 }; 595 };
597 596
598 // Allocate memory space. 597 // Allocate memory space.
599 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t)); 598 AllocMemoryBuffers(kAllocSize, sizeof(uint32_t));
600 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_); 599 uint32_t* src = reinterpret_cast<uint32_t*>(memory_src_);
601 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_); 600 uint32_t* dst = reinterpret_cast<uint32_t*>(memory_dst_);
602 601
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 EXPECT_EQ("Enabled", experiments["SyzyASANLargeBlockHeap"]); 661 EXPECT_EQ("Enabled", experiments["SyzyASANLargeBlockHeap"]);
663 EXPECT_EQ("Disabled", experiments["SyzyASANCrashpad"]); 662 EXPECT_EQ("Disabled", experiments["SyzyASANCrashpad"]);
664 663
665 // This implicitly asserts the full contents of the map by asserting 664 // This implicitly asserts the full contents of the map by asserting
666 // on the size after looking up the expected keys. 665 // on the size after looking up the expected keys.
667 EXPECT_EQ(3U, experiments.size()); 666 EXPECT_EQ(3U, experiments.size());
668 } 667 }
669 668
670 } // namespace asan 669 } // namespace asan
671 } // namespace agent 670 } // namespace agent
OLDNEW
« no previous file with comments | « syzygy/agent/asan/memory_interceptors.h ('k') | syzygy/agent/asan/syzyasan_rtl.def.template » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698