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

Side by Side Diff: util/mac/checked_mach_address_range_test.cc

Issue 513453002: Add CheckedMachAddressRange and its test (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Address review feedback Created 6 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 | « util/mac/checked_mach_address_range.cc ('k') | util/util.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 The Crashpad Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (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
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "util/mac/checked_mach_address_range.h"
16
17 #include <mach/mach.h>
18
19 #include <limits>
20
21 #include "base/basictypes.h"
22 #include "base/strings/stringprintf.h"
23 #include "build/build_config.h"
24 #include "gtest/gtest.h"
25 #include "util/mac/process_reader.h"
26
27 namespace {
28
29 using namespace crashpad;
30
31 #if defined(ARCH_CPU_64_BITS)
32 const bool kValid64Invalid32 = true;
33 #else
34 const bool kValid64Invalid32 = false;
35 #endif
36
37 TEST(CheckedMachAddressRange, IsValid) {
38 const struct TestData {
39 mach_vm_address_t base;
40 mach_vm_size_t size;
41 bool valid;
42 } kTestData[] = {
43 {0, 0, true},
44 {0, 1, true},
45 {0, 2, true},
46 {0, 0x7fffffff, true},
47 {0, 0x80000000, true},
48 {0, 0xfffffffe, true},
49 {0, 0xffffffff, true},
50 {0, 0xffffffffffffffff, kValid64Invalid32},
51 {1, 0, true},
52 {1, 1, true},
53 {1, 2, true},
54 {1, 0x7fffffff, true},
55 {1, 0x80000000, true},
56 {1, 0xfffffffe, true},
57 {1, 0xffffffff, kValid64Invalid32},
58 {1, 0xfffffffffffffffe, kValid64Invalid32},
59 {1, 0xffffffffffffffff, false},
60 {0x7fffffff, 0, true},
61 {0x7fffffff, 1, true},
62 {0x7fffffff, 2, true},
63 {0x7fffffff, 0x7fffffff, true},
64 {0x7fffffff, 0x80000000, true},
65 {0x7fffffff, 0xfffffffe, kValid64Invalid32},
66 {0x7fffffff, 0xffffffff, kValid64Invalid32},
67 {0x80000000, 0, true},
68 {0x80000000, 1, true},
69 {0x80000000, 2, true},
70 {0x80000000, 0x7fffffff, true},
71 {0x80000000, 0x80000000, kValid64Invalid32},
72 {0x80000000, 0xfffffffe, kValid64Invalid32},
73 {0x80000000, 0xffffffff, kValid64Invalid32},
74 {0xfffffffe, 0, true},
75 {0xfffffffe, 1, true},
76 {0xfffffffe, 2, kValid64Invalid32},
77 {0xfffffffe, 0x7fffffff, kValid64Invalid32},
78 {0xfffffffe, 0x80000000, kValid64Invalid32},
79 {0xfffffffe, 0xfffffffe, kValid64Invalid32},
80 {0xfffffffe, 0xffffffff, kValid64Invalid32},
81 {0xffffffff, 0, true},
82 {0xffffffff, 1, kValid64Invalid32},
83 {0xffffffff, 2, kValid64Invalid32},
84 {0xffffffff, 0x7fffffff, kValid64Invalid32},
85 {0xffffffff, 0x80000000, kValid64Invalid32},
86 {0xffffffff, 0xfffffffe, kValid64Invalid32},
87 {0xffffffff, 0xffffffff, kValid64Invalid32},
88 {0x7fffffffffffffff, 0, kValid64Invalid32},
89 {0x7fffffffffffffff, 1, kValid64Invalid32},
90 {0x7fffffffffffffff, 2, kValid64Invalid32},
91 {0x7fffffffffffffff, 0x7fffffffffffffff, kValid64Invalid32},
92 {0x7fffffffffffffff, 0x8000000000000000, kValid64Invalid32},
93 {0x7fffffffffffffff, 0x8000000000000001, false},
94 {0x7fffffffffffffff, 0xfffffffffffffffe, false},
95 {0x7fffffffffffffff, 0xffffffffffffffff, false},
96 {0x8000000000000000, 0, kValid64Invalid32},
97 {0x8000000000000000, 1, kValid64Invalid32},
98 {0x8000000000000000, 2, kValid64Invalid32},
99 {0x8000000000000000, 0x7fffffffffffffff, kValid64Invalid32},
100 {0x8000000000000000, 0x8000000000000000, false},
101 {0x8000000000000000, 0x8000000000000001, false},
102 {0x8000000000000000, 0xfffffffffffffffe, false},
103 {0x8000000000000000, 0xffffffffffffffff, false},
104 {0xfffffffffffffffe, 0, kValid64Invalid32},
105 {0xfffffffffffffffe, 1, kValid64Invalid32},
106 {0xfffffffffffffffe, 2, false},
107 {0xffffffffffffffff, 0, kValid64Invalid32},
108 {0xffffffffffffffff, 1, false},
109 };
110
111 ProcessReader process_reader;
112 ASSERT_TRUE(process_reader.Initialize(mach_task_self()));
113
114 for (size_t index = 0; index < arraysize(kTestData); ++index) {
115 const TestData& testcase = kTestData[index];
116 SCOPED_TRACE(base::StringPrintf("index %zu, base 0x%llx, size 0x%llx",
117 index,
118 testcase.base,
119 testcase.size));
120
121 CheckedMachAddressRange range(
122 &process_reader, testcase.base, testcase.size);
123 EXPECT_EQ(testcase.valid, range.IsValid());
124 }
125 }
126
127 TEST(CheckedMachAddressRange, ContainsValue) {
128 const struct TestData {
129 mach_vm_address_t value;
130 bool valid;
131 } kTestData[] = {
132 {0, false},
133 {1, false},
134 {0x1fff, false},
135 {0x2000, true},
136 {0x2001, true},
137 {0x2ffe, true},
138 {0x2fff, true},
139 {0x3000, false},
140 {0x3001, false},
141 {0x7fffffff, false},
142 {0x80000000, false},
143 {0x80000001, false},
144 {0x80001fff, false},
145 {0x80002000, false},
146 {0x80002001, false},
147 {0x80002ffe, false},
148 {0x80002fff, false},
149 {0x80003000, false},
150 {0x80003001, false},
151 {0xffffcfff, false},
152 {0xffffdfff, false},
153 {0xffffefff, false},
154 {0xffffffff, false},
155 {0x100000000, false},
156 {0xffffffffffffffff, false},
157 };
158
159 ProcessReader process_reader;
160 ASSERT_TRUE(process_reader.Initialize(mach_task_self()));
161
162 CheckedMachAddressRange parent_range(&process_reader, 0x2000, 0x1000);
163 ASSERT_TRUE(parent_range.IsValid());
164
165 for (size_t index = 0; index < arraysize(kTestData); ++index) {
166 const TestData& testcase = kTestData[index];
167 SCOPED_TRACE(
168 base::StringPrintf("index %zu, value 0x%llx", index, testcase.value));
169
170 EXPECT_EQ(testcase.valid, parent_range.ContainsValue(testcase.value));
171 }
172
173 CheckedMachAddressRange parent_range_64(&process_reader, 0x100000000, 0x1000);
174 ASSERT_EQ(kValid64Invalid32, parent_range_64.IsValid());
175 if (parent_range_64.IsValid()) {
176 EXPECT_FALSE(parent_range_64.ContainsValue(0xffffffff));
177 EXPECT_TRUE(parent_range_64.ContainsValue(0x100000000));
178 EXPECT_TRUE(parent_range_64.ContainsValue(0x100000001));
179 EXPECT_TRUE(parent_range_64.ContainsValue(0x100000fff));
180 EXPECT_FALSE(parent_range_64.ContainsValue(0x100001000));
181 }
182 }
183
184 TEST(CheckedMachAddressRange, ContainsRange) {
185 const struct TestData {
186 mach_vm_address_t base;
187 mach_vm_size_t size;
188 bool valid;
189 } kTestData[] = {
190 {0, 0, false},
191 {0, 1, false},
192 {0x2000, 0x1000, true},
193 {0, 0x2000, false},
194 {0x3000, 0x1000, false},
195 {0x1800, 0x1000, false},
196 {0x2800, 0x1000, false},
197 {0x2000, 0x800, true},
198 {0x2800, 0x800, true},
199 {0x2400, 0x800, true},
200 {0x2800, 0, true},
201 {0x2000, 0xffffdfff, false},
202 {0x2800, 0xffffd7ff, false},
203 {0x3000, 0xffffcfff, false},
204 {0xfffffffe, 1, false},
205 {0xffffffff, 0, false},
206 {0x1fff, 0, false},
207 {0x2000, 0, true},
208 {0x2001, 0, true},
209 {0x2fff, 0, true},
210 {0x3000, 0, true},
211 {0x3001, 0, false},
212 {0x1fff, 1, false},
213 {0x2000, 1, true},
214 {0x2001, 1, true},
215 {0x2fff, 1, true},
216 {0x3000, 1, false},
217 {0x3001, 1, false},
218 };
219
220 ProcessReader process_reader;
221 ASSERT_TRUE(process_reader.Initialize(mach_task_self()));
222
223 CheckedMachAddressRange parent_range(&process_reader, 0x2000, 0x1000);
224 ASSERT_TRUE(parent_range.IsValid());
225
226 for (size_t index = 0; index < arraysize(kTestData); ++index) {
227 const TestData& testcase = kTestData[index];
228 SCOPED_TRACE(base::StringPrintf("index %zu, base 0x%llx, size 0x%llx",
229 index,
230 testcase.base,
231 testcase.size));
232
233 CheckedMachAddressRange child_range(
234 &process_reader, testcase.base, testcase.size);
235 ASSERT_TRUE(child_range.IsValid());
236 EXPECT_EQ(testcase.valid, parent_range.ContainsRange(child_range));
237 }
238
239 CheckedMachAddressRange parent_range_64(&process_reader, 0x100000000, 0x1000);
240 ASSERT_EQ(kValid64Invalid32, parent_range_64.IsValid());
241 if (parent_range_64.IsValid()) {
242 CheckedMachAddressRange child_range_64(&process_reader, 0xffffffff, 2);
243 EXPECT_FALSE(parent_range_64.ContainsRange(child_range_64));
244
245 child_range_64.SetRange(&process_reader, 0x100000000, 2);
246 EXPECT_TRUE(parent_range_64.ContainsRange(child_range_64));
247
248 child_range_64.SetRange(&process_reader, 0x100000ffe, 2);
249 EXPECT_TRUE(parent_range_64.ContainsRange(child_range_64));
250
251 child_range_64.SetRange(&process_reader, 0x100000fff, 2);
252 EXPECT_FALSE(parent_range_64.ContainsRange(child_range_64));
253 }
254 }
255
256 } // namespace
OLDNEW
« no previous file with comments | « util/mac/checked_mach_address_range.cc ('k') | util/util.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698