authorgravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2022-06-23 17:27:55-07:00
committergravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2022-06-23 17:27:55-07:00
log19d7f4dd8221fcd36b7fb71067bf676bb294ca1c
treee469751ee0dd7bd3671c0f22fce96a66692f2dad
parentc321b2f2a0257fa45262f1ece0a263b22e8c70f3

FailingAllocator: Only capture the stack trace of the first induced allocation failure

This is a precaution to avoid confusing stack traces on the off chance that FailingAllocator continues to try to allocate after the first failure.

1 files changed, 9 insertions(+), 7 deletions(-)

lib/std/testing/failing_allocator.zig+9-7
...@@ -56,13 +56,15 @@ pub const FailingAllocator = struct {...@@ -56,13 +56,15 @@ pub const FailingAllocator = struct {
56 return_address: usize,56 return_address: usize,
57 ) error{OutOfMemory}![]u8 {57 ) error{OutOfMemory}![]u8 {
58 if (self.index == self.fail_index) {58 if (self.index == self.fail_index) {
59 mem.set(usize, &self.stack_addresses, 0);59 if (!self.has_induced_failure) {
60 var stack_trace = std.builtin.StackTrace{60 mem.set(usize, &self.stack_addresses, 0);
61 .instruction_addresses = &self.stack_addresses,61 var stack_trace = std.builtin.StackTrace{
62 .index = 0,62 .instruction_addresses = &self.stack_addresses,
63 };63 .index = 0,
64 std.debug.captureStackTrace(return_address, &stack_trace);64 };
65 self.has_induced_failure = true;65 std.debug.captureStackTrace(return_address, &stack_trace);
66 self.has_induced_failure = true;
67 }
66 return error.OutOfMemory;68 return error.OutOfMemory;
67 }69 }
68 const result = try self.internal_allocator.rawAlloc(len, ptr_align, len_align, return_address);70 const result = try self.internal_allocator.rawAlloc(len, ptr_align, len_align, return_address);