OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "platform/assert.h" | 5 #include "platform/assert.h" |
6 #include "vm/unit_test.h" | 6 #include "vm/unit_test.h" |
7 #include "vm/verified_memory.h" | 7 #include "vm/verified_memory.h" |
8 | 8 |
9 namespace dart { | 9 namespace dart { |
10 | 10 |
11 void Init() { | 11 void Init() { |
12 #if defined(DEBUG) | 12 #if defined(DEBUG) |
13 FLAG_verified_mem = true; | 13 FLAG_verified_mem = true; |
14 #endif | 14 #endif |
15 } | 15 } |
16 | 16 |
17 | 17 |
18 void Shutdown() { | 18 void Shutdown() { |
19 #if defined(DEBUG) | 19 #if defined(DEBUG) |
20 // We must reset this to false to avoid checking some assumptions in | 20 // We must reset this to false to avoid checking some assumptions in |
21 // VM shutdown that are left violated by these tests. | 21 // VM shutdown that are left violated by these tests. |
22 FLAG_verified_mem = false; | 22 FLAG_verified_mem = false; |
23 #endif | 23 #endif |
24 } | 24 } |
25 | 25 |
26 | 26 |
27 UNIT_TEST_CASE(VerifiedMemoryReserve) { | 27 VM_UNIT_TEST_CASE(VerifiedMemoryReserve) { |
28 Init(); | 28 Init(); |
29 const intptr_t kReservationSize = 64 * KB; | 29 const intptr_t kReservationSize = 64 * KB; |
30 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); | 30 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); |
31 EXPECT_EQ(kReservationSize, vm->size()); | 31 EXPECT_EQ(kReservationSize, vm->size()); |
32 delete vm; | 32 delete vm; |
33 Shutdown(); | 33 Shutdown(); |
34 } | 34 } |
35 | 35 |
36 | 36 |
37 UNIT_TEST_CASE(VerifiedMemoryCommit) { | 37 VM_UNIT_TEST_CASE(VerifiedMemoryCommit) { |
38 Init(); | 38 Init(); |
39 const intptr_t kReservationSize = 64 * KB; | 39 const intptr_t kReservationSize = 64 * KB; |
40 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); | 40 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); |
41 EXPECT_EQ(kReservationSize, vm->size()); | 41 EXPECT_EQ(kReservationSize, vm->size()); |
42 vm->Commit(false); | 42 vm->Commit(false); |
43 delete vm; | 43 delete vm; |
44 Shutdown(); | 44 Shutdown(); |
45 } | 45 } |
46 | 46 |
47 | 47 |
48 UNIT_TEST_CASE(VerifiedMemoryBasic) { | 48 VM_UNIT_TEST_CASE(VerifiedMemoryBasic) { |
49 Init(); | 49 Init(); |
50 const intptr_t kReservationSize = 64 * KB; | 50 const intptr_t kReservationSize = 64 * KB; |
51 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); | 51 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); |
52 EXPECT_EQ(kReservationSize, vm->size()); | 52 EXPECT_EQ(kReservationSize, vm->size()); |
53 vm->Commit(false); | 53 vm->Commit(false); |
54 double* addr = reinterpret_cast<double*>(vm->address()); | 54 double* addr = reinterpret_cast<double*>(vm->address()); |
55 VerifiedMemory::Write(&addr[0], 0.5); | 55 VerifiedMemory::Write(&addr[0], 0.5); |
56 EXPECT_EQ(0.5, addr[0]); | 56 EXPECT_EQ(0.5, addr[0]); |
57 VerifiedMemory::Write(&addr[1], 1.5); | 57 VerifiedMemory::Write(&addr[1], 1.5); |
58 VerifiedMemory::Write(&addr[2], 2.5); | 58 VerifiedMemory::Write(&addr[2], 2.5); |
59 VerifiedMemory::Write(&addr[0], 0.25); | 59 VerifiedMemory::Write(&addr[0], 0.25); |
60 static const double kNaN = NAN; | 60 static const double kNaN = NAN; |
61 VerifiedMemory::Write(&addr[0], kNaN); // Bitwise comparison should be used. | 61 VerifiedMemory::Write(&addr[0], kNaN); // Bitwise comparison should be used. |
62 VerifiedMemory::Write(&addr[0], 0.5); | 62 VerifiedMemory::Write(&addr[0], 0.5); |
63 int64_t* unverified = reinterpret_cast<int64_t*>(&addr[3]); | 63 int64_t* unverified = reinterpret_cast<int64_t*>(&addr[3]); |
64 *unverified = 123; | 64 *unverified = 123; |
65 VerifiedMemory::Verify(reinterpret_cast<uword>(addr), 3 * sizeof(double)); | 65 VerifiedMemory::Verify(reinterpret_cast<uword>(addr), 3 * sizeof(double)); |
66 delete vm; | 66 delete vm; |
67 Shutdown(); | 67 Shutdown(); |
68 } | 68 } |
69 | 69 |
70 | 70 |
71 UNIT_TEST_CASE(VerifiedMemoryAccept) { | 71 VM_UNIT_TEST_CASE(VerifiedMemoryAccept) { |
72 Init(); | 72 Init(); |
73 const intptr_t kReservationSize = 64 * KB; | 73 const intptr_t kReservationSize = 64 * KB; |
74 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); | 74 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); |
75 EXPECT_EQ(kReservationSize, vm->size()); | 75 EXPECT_EQ(kReservationSize, vm->size()); |
76 vm->Commit(false); | 76 vm->Commit(false); |
77 double* addr = reinterpret_cast<double*>(vm->address()); | 77 double* addr = reinterpret_cast<double*>(vm->address()); |
78 VerifiedMemory::Write(&addr[0], 0.5); | 78 VerifiedMemory::Write(&addr[0], 0.5); |
79 VerifiedMemory::Write(&addr[1], 1.5); | 79 VerifiedMemory::Write(&addr[1], 1.5); |
80 VerifiedMemory::Write(&addr[2], 2.5); | 80 VerifiedMemory::Write(&addr[2], 2.5); |
81 VerifiedMemory::Write(&addr[0], 0.25); | 81 VerifiedMemory::Write(&addr[0], 0.25); |
82 // Unverified write followed by Accept ("I know what I'm doing"). | 82 // Unverified write followed by Accept ("I know what I'm doing"). |
83 memset(addr, 0xf3, 2 * sizeof(double)); | 83 memset(addr, 0xf3, 2 * sizeof(double)); |
84 VerifiedMemory::Accept(reinterpret_cast<uword>(addr), 2 * sizeof(double)); | 84 VerifiedMemory::Accept(reinterpret_cast<uword>(addr), 2 * sizeof(double)); |
85 VerifiedMemory::Verify(reinterpret_cast<uword>(addr), 3 * sizeof(double)); | 85 VerifiedMemory::Verify(reinterpret_cast<uword>(addr), 3 * sizeof(double)); |
86 delete vm; | 86 delete vm; |
87 Shutdown(); | 87 Shutdown(); |
88 } | 88 } |
89 | 89 |
90 | 90 |
91 // Negative tests below. | 91 // Negative tests below. |
92 | 92 |
93 UNIT_TEST_CASE(VerifyImplicit_Crash) { | 93 VM_UNIT_TEST_CASE(VerifyImplicit_Crash) { |
94 Init(); | 94 Init(); |
95 const intptr_t kReservationSize = 64 * KB; | 95 const intptr_t kReservationSize = 64 * KB; |
96 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); | 96 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); |
97 EXPECT_EQ(kReservationSize, vm->size()); | 97 EXPECT_EQ(kReservationSize, vm->size()); |
98 vm->Commit(false); | 98 vm->Commit(false); |
99 double* addr = reinterpret_cast<double*>(vm->address()); | 99 double* addr = reinterpret_cast<double*>(vm->address()); |
100 addr[0] = 0.5; // Forget to use Write. | 100 addr[0] = 0.5; // Forget to use Write. |
101 VerifiedMemory::Write(&addr[0], 1.5); | 101 VerifiedMemory::Write(&addr[0], 1.5); |
102 Shutdown(); | 102 Shutdown(); |
103 } | 103 } |
104 | 104 |
105 | 105 |
106 UNIT_TEST_CASE(VerifyExplicit_Crash) { | 106 VM_UNIT_TEST_CASE(VerifyExplicit_Crash) { |
107 Init(); | 107 Init(); |
108 const intptr_t kReservationSize = 64 * KB; | 108 const intptr_t kReservationSize = 64 * KB; |
109 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); | 109 VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize); |
110 EXPECT_EQ(kReservationSize, vm->size()); | 110 EXPECT_EQ(kReservationSize, vm->size()); |
111 vm->Commit(false); | 111 vm->Commit(false); |
112 double* addr = reinterpret_cast<double*>(vm->address()); | 112 double* addr = reinterpret_cast<double*>(vm->address()); |
113 VerifiedMemory::Write(&addr[0], 0.5); | 113 VerifiedMemory::Write(&addr[0], 0.5); |
114 VerifiedMemory::Write(&addr[1], 1.5); | 114 VerifiedMemory::Write(&addr[1], 1.5); |
115 addr[1] = 3.5; // Forget to use Write. | 115 addr[1] = 3.5; // Forget to use Write. |
116 VerifiedMemory::Write(&addr[2], 2.5); | 116 VerifiedMemory::Write(&addr[2], 2.5); |
117 VerifiedMemory::Verify(reinterpret_cast<uword>(addr), 3 * sizeof(double)); | 117 VerifiedMemory::Verify(reinterpret_cast<uword>(addr), 3 * sizeof(double)); |
118 Shutdown(); | 118 Shutdown(); |
119 } | 119 } |
120 | 120 |
121 } // namespace dart | 121 } // namespace dart |
OLD | NEW |