From a1079e9fd6f01b6c33ad6da999d2538c0607bbb5 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Tue, 8 Oct 2019 22:42:51 +0000 Subject: [PATCH] Fix undefined in format-test (#1349) When `MoveCtor` performs `check_move_buffer`, the buffer allocator becomes null, but then `MoveCtor` attempts to use it to allocate a dynamic buffer. This succeeds nevertheless because a typical `std::allocator::allocate` does not use `this`, so it does not crash when `this` is null. Fixes #1344 --- test/format-test.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/test/format-test.cc b/test/format-test.cc index f03a2bd6..a9022eac 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -271,7 +271,7 @@ static void check_move_buffer( EXPECT_EQ(alloc, buffer2.get_allocator().get()); } -TEST(MemoryBufferTest, MoveCtor) { +TEST(MemoryBufferTest, MoveCtorInlineBuffer) { std::allocator alloc; basic_memory_buffer buffer((TestAllocator(&alloc))); const char test[] = "test"; @@ -281,15 +281,22 @@ TEST(MemoryBufferTest, MoveCtor) { // dynamic allocation. buffer.push_back('a'); check_move_buffer("testa", buffer); +} + +TEST(MemoryBufferTest, MoveCtorDynamicBuffer) { + std::allocator alloc; + basic_memory_buffer buffer((TestAllocator(&alloc))); + const char test[] = "test"; + buffer.append(test, test + 4); const char* inline_buffer_ptr = &buffer[0]; // Adding one more character causes the content to move from the inline to // a dynamically allocated buffer. - buffer.push_back('b'); - basic_memory_buffer buffer2(std::move(buffer)); + buffer.push_back('a'); + basic_memory_buffer buffer2(std::move(buffer)); // Move should rip the guts of the first buffer. EXPECT_EQ(inline_buffer_ptr, &buffer[0]); - EXPECT_EQ("testab", std::string(&buffer2[0], buffer2.size())); - EXPECT_GT(buffer2.capacity(), 5u); + EXPECT_EQ("testa", std::string(&buffer2[0], buffer2.size())); + EXPECT_GT(buffer2.capacity(), 4u); } static void check_move_assign_buffer(const char* str,