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

Side by Side Diff: syzygy/agent/asan/heaps/zebra_block_heap_unittest.cc

Issue 2508333002: Remove the is_nested bit from the BlockInfo structure. (Closed)
Patch Set: Address Siggi's comments. Created 4 years, 1 month 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
OLDNEW
1 // Copyright 2014 Google Inc. All Rights Reserved. 1 // Copyright 2014 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 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 TEST(ZebraBlockHeapTest, AllocateEmptyBlock) { 89 TEST(ZebraBlockHeapTest, AllocateEmptyBlock) {
90 TestZebraBlockHeap h; 90 TestZebraBlockHeap h;
91 BlockLayout layout = {}; 91 BlockLayout layout = {};
92 BlockInfo block = {}; 92 BlockInfo block = {};
93 93
94 // Allocate and free a zero-sized allocation. This should succeed 94 // Allocate and free a zero-sized allocation. This should succeed
95 // by definition. 95 // by definition.
96 void* alloc = h.AllocateBlock(0, 0, 0, &layout); 96 void* alloc = h.AllocateBlock(0, 0, 0, &layout);
97 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc); 97 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc);
98 EXPECT_TRUE(IsAligned(alloc, kShadowRatio)); 98 EXPECT_TRUE(IsAligned(alloc, kShadowRatio));
99 BlockInitialize(layout, alloc, false, &block); 99 BlockInitialize(layout, alloc, &block);
100 EXPECT_TRUE(h.FreeBlock(block)); 100 EXPECT_TRUE(h.FreeBlock(block));
101 } 101 }
102 102
103 TEST(ZebraBlockHeapTest, EndToEnd) { 103 TEST(ZebraBlockHeapTest, EndToEnd) {
104 TestZebraBlockHeap h; 104 TestZebraBlockHeap h;
105 BlockLayout layout = {}; 105 BlockLayout layout = {};
106 BlockInfo block = {}; 106 BlockInfo block = {};
107 107
108 // Make a bunch of different sized allocations. 108 // Make a bunch of different sized allocations.
109 std::vector<BlockInfo> blocks; 109 std::vector<BlockInfo> blocks;
110 for (uint32_t i = 1; i < 100; i++) { 110 for (uint32_t i = 1; i < 100; i++) {
111 void* alloc = h.AllocateBlock(i, 0, 0, &layout); 111 void* alloc = h.AllocateBlock(i, 0, 0, &layout);
112 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc); 112 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc);
113 EXPECT_TRUE(IsAligned(alloc, kShadowRatio)); 113 EXPECT_TRUE(IsAligned(alloc, kShadowRatio));
114 BlockInitialize(layout, alloc, false, &block); 114 BlockInitialize(layout, alloc, &block);
115 blocks.push_back(block); 115 blocks.push_back(block);
116 } 116 }
117 117
118 // Now free them. 118 // Now free them.
119 for (size_t i = 0; i < blocks.size(); ++i) 119 for (size_t i = 0; i < blocks.size(); ++i)
120 EXPECT_TRUE(h.FreeBlock(blocks[i])); 120 EXPECT_TRUE(h.FreeBlock(blocks[i]));
121 } 121 }
122 122
123 TEST(ZebraBlockHeapTest, BlocksHaveCorrectAlignment) { 123 TEST(ZebraBlockHeapTest, BlocksHaveCorrectAlignment) {
124 TestZebraBlockHeap h; 124 TestZebraBlockHeap h;
125 BlockLayout layout = {}; 125 BlockLayout layout = {};
126 BlockInfo block = {}; 126 BlockInfo block = {};
127 127
128 // Allocate blocks with different header, body and trailer sizes . 128 // Allocate blocks with different header, body and trailer sizes .
129 for (uint32_t header_size = 0; header_size < 100; header_size += 3) { 129 for (uint32_t header_size = 0; header_size < 100; header_size += 3) {
130 for (uint32_t trailer_size = 0; trailer_size < 100; trailer_size += 3) { 130 for (uint32_t trailer_size = 0; trailer_size < 100; trailer_size += 3) {
131 for (uint32_t body_size = 0; body_size < 100; body_size += 3) { 131 for (uint32_t body_size = 0; body_size < 100; body_size += 3) {
132 void* alloc = h.AllocateBlock(body_size, header_size, 132 void* alloc = h.AllocateBlock(body_size, header_size,
133 trailer_size, &layout); 133 trailer_size, &layout);
134 134
135 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc); 135 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc);
136 EXPECT_TRUE(IsAligned(alloc, kShadowRatio)); 136 EXPECT_TRUE(IsAligned(alloc, kShadowRatio));
137 137
138 BlockInitialize(layout, alloc, false, &block); 138 BlockInitialize(layout, alloc, &block);
139 139
140 // The header (== block), body and the end of the trailer must be 140 // The header (== block), body and the end of the trailer must be
141 // kShadowRatio aligned. 141 // kShadowRatio aligned.
142 EXPECT_TRUE(IsAligned(block.body, kShadowRatio)); 142 EXPECT_TRUE(IsAligned(block.body, kShadowRatio));
143 EXPECT_TRUE(IsAligned(block.header, kShadowRatio)); 143 EXPECT_TRUE(IsAligned(block.header, kShadowRatio));
144 EXPECT_TRUE(IsAligned(block.header, GetPageSize())); 144 EXPECT_TRUE(IsAligned(block.header, GetPageSize()));
145 EXPECT_TRUE(IsAligned(block.trailer + 1, GetPageSize())); 145 EXPECT_TRUE(IsAligned(block.trailer + 1, GetPageSize()));
146 146
147 uint32_t right_redzone_size = block.TotalTrailerSize(); 147 uint32_t right_redzone_size = block.TotalTrailerSize();
148 148
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 187
188 const uint32_t kMaxAllowedBlockSize = static_cast<uint32_t>(GetPageSize()) - 188 const uint32_t kMaxAllowedBlockSize = static_cast<uint32_t>(GetPageSize()) -
189 sizeof(BlockHeader); 189 sizeof(BlockHeader);
190 190
191 // Allocate all possible block sizes. 191 // Allocate all possible block sizes.
192 for (uint32_t i = 0; i <= kMaxAllowedBlockSize; ++i) { 192 for (uint32_t i = 0; i <= kMaxAllowedBlockSize; ++i) {
193 uint8_t* alloc = reinterpret_cast<uint8_t*>( 193 uint8_t* alloc = reinterpret_cast<uint8_t*>(
194 h.AllocateBlock(i, sizeof(BlockHeader), sizeof(BlockTrailer), &layout)); 194 h.AllocateBlock(i, sizeof(BlockHeader), sizeof(BlockTrailer), &layout));
195 195
196 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc); 196 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc);
197 BlockInitialize(layout, alloc, false, &block); 197 BlockInitialize(layout, alloc, &block);
198 EXPECT_TRUE(h.FreeBlock(block)); 198 EXPECT_TRUE(h.FreeBlock(block));
199 } 199 }
200 200
201 // Impossible block sizes. 201 // Impossible block sizes.
202 for (uint32_t delta = 1; delta < 10000; delta += 7) 202 for (uint32_t delta = 1; delta < 10000; delta += 7)
203 EXPECT_EQ(reinterpret_cast<uint8_t*>(NULL), 203 EXPECT_EQ(reinterpret_cast<uint8_t*>(NULL),
204 h.AllocateBlock(kMaxAllowedBlockSize + delta, sizeof(BlockHeader), 204 h.AllocateBlock(kMaxAllowedBlockSize + delta, sizeof(BlockHeader),
205 sizeof(BlockTrailer), &layout)); 205 sizeof(BlockTrailer), &layout));
206 } 206 }
207 207
(...skipping 10 matching lines...) Expand all
218 EXPECT_TRUE(IsAligned(mem1, kShadowRatio)); 218 EXPECT_TRUE(IsAligned(mem1, kShadowRatio));
219 219
220 void* mem2 = h.AllocateBlock(0, sizeof(BlockHeader), sizeof(BlockTrailer), 220 void* mem2 = h.AllocateBlock(0, sizeof(BlockHeader), sizeof(BlockTrailer),
221 &layout2); 221 &layout2);
222 EXPECT_NE(reinterpret_cast<void*>(NULL), mem2); 222 EXPECT_NE(reinterpret_cast<void*>(NULL), mem2);
223 EXPECT_TRUE(IsAligned(mem2, kShadowRatio)); 223 EXPECT_TRUE(IsAligned(mem2, kShadowRatio));
224 224
225 // Empty blocks cannot have the same address. 225 // Empty blocks cannot have the same address.
226 EXPECT_NE(mem1, mem2); 226 EXPECT_NE(mem1, mem2);
227 227
228 BlockInitialize(layout1, mem1, false, &block1); 228 BlockInitialize(layout1, mem1, &block1);
229 BlockInitialize(layout2, mem2, false, &block2); 229 BlockInitialize(layout2, mem2, &block2);
230 230
231 EXPECT_TRUE(h.FreeBlock(block1)); 231 EXPECT_TRUE(h.FreeBlock(block1));
232 EXPECT_TRUE(h.FreeBlock(block2)); 232 EXPECT_TRUE(h.FreeBlock(block2));
233 } 233 }
234 234
235 235
236 TEST(ZebraBlockHeapTest, AllocateUntilFull) { 236 TEST(ZebraBlockHeapTest, AllocateUntilFull) {
237 TestZebraBlockHeap h; 237 TestZebraBlockHeap h;
238 // Test maximum number of allocations. 238 // Test maximum number of allocations.
239 std::vector<uint8_t*> buffers; 239 std::vector<uint8_t*> buffers;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 if (alloc != NULL) { 358 if (alloc != NULL) {
359 // Check that the block is well formed. 359 // Check that the block is well formed.
360 EXPECT_TRUE(header_size + body_size <= GetPageSize()); 360 EXPECT_TRUE(header_size + body_size <= GetPageSize());
361 EXPECT_TRUE(trailer_size <= GetPageSize()); 361 EXPECT_TRUE(trailer_size <= GetPageSize());
362 362
363 size_t body_end_offset = layout.header_size + 363 size_t body_end_offset = layout.header_size +
364 layout.header_padding_size + layout.body_size; 364 layout.header_padding_size + layout.body_size;
365 365
366 EXPECT_EQ(GetPageSize(), 366 EXPECT_EQ(GetPageSize(),
367 ::common::AlignUp(body_end_offset, kShadowRatio)); 367 ::common::AlignUp(body_end_offset, kShadowRatio));
368 BlockInitialize(layout, alloc, false, &block); 368 BlockInitialize(layout, alloc, &block);
369 EXPECT_TRUE(h.FreeBlock(block)); 369 EXPECT_TRUE(h.FreeBlock(block));
370 } else { 370 } else {
371 size_t body_end_offset = layout.header_size + 371 size_t body_end_offset = layout.header_size +
372 layout.header_padding_size + layout.body_size; 372 layout.header_padding_size + layout.body_size;
373 373
374 // Check the cause of the unsuccessful allocation. 374 // Check the cause of the unsuccessful allocation.
375 EXPECT_TRUE( 375 EXPECT_TRUE(
376 // Even page overflow. 376 // Even page overflow.
377 (header_size + body_size > GetPageSize()) || 377 (header_size + body_size > GetPageSize()) ||
378 // Odd page overflow. 378 // Odd page overflow.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 TestZebraBlockHeap h; 412 TestZebraBlockHeap h;
413 BlockLayout layout = {}; 413 BlockLayout layout = {};
414 BlockInfo block = {}; 414 BlockInfo block = {};
415 415
416 // Fill the heap. 416 // Fill the heap.
417 std::vector<BlockInfo> blocks; 417 std::vector<BlockInfo> blocks;
418 for (size_t i = 0; i < h.slab_count_; i++) { 418 for (size_t i = 0; i < h.slab_count_; i++) {
419 void* alloc = h.AllocateBlock(0xFF, 0, 0, &layout); 419 void* alloc = h.AllocateBlock(0xFF, 0, 0, &layout);
420 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc); 420 EXPECT_NE(reinterpret_cast<void*>(NULL), alloc);
421 EXPECT_TRUE(IsAligned(alloc, kShadowRatio)); 421 EXPECT_TRUE(IsAligned(alloc, kShadowRatio));
422 BlockInitialize(layout, alloc, false, &block); 422 BlockInitialize(layout, alloc, &block);
423 blocks.push_back(block); 423 blocks.push_back(block);
424 CompactBlockInfo compact = {}; 424 CompactBlockInfo compact = {};
425 ConvertBlockInfo(block, &compact); 425 ConvertBlockInfo(block, &compact);
426 EXPECT_TRUE(h.Push(compact).push_successful); 426 EXPECT_TRUE(h.Push(compact).push_successful);
427 } 427 }
428 428
429 for (size_t i = 0; i < h.slab_count_; i++) { 429 for (size_t i = 0; i < h.slab_count_; i++) {
430 CompactBlockInfo dummy = {}; 430 CompactBlockInfo dummy = {};
431 bool old_invariant = h.QuarantineInvariantIsSatisfied(); 431 bool old_invariant = h.QuarantineInvariantIsSatisfied();
432 if (h.Pop(&dummy).pop_successful) { 432 if (h.Pop(&dummy).pop_successful) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 469
470 h.Lock(); 470 h.Lock();
471 EXPECT_TRUE(h.TryLock()); 471 EXPECT_TRUE(h.TryLock());
472 h.Unlock(); 472 h.Unlock();
473 h.Unlock(); 473 h.Unlock();
474 } 474 }
475 475
476 } // namespace heaps 476 } // namespace heaps
477 } // namespace asan 477 } // namespace asan
478 } // namespace agent 478 } // namespace agent
OLDNEW
« no previous file with comments | « syzygy/agent/asan/heaps/simple_block_heap_unittest.cc ('k') | syzygy/agent/asan/page_protection_helpers_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698