diff options
author | Orivej Desh <orivej@gmx.fr> | 2019-10-08 22:42:51 +0000 |
---|---|---|
committer | Victor Zverovich <victor.zverovich@gmail.com> | 2019-10-08 15:42:51 -0700 |
commit | a1079e9fd6f01b6c33ad6da999d2538c0607bbb5 (patch) | |
tree | e30a108330a06b7a5e5b7af79ada9bc22d7bdf01 /test | |
parent | b66bb6b71feac52f86dbe7424a4db200154fc7f0 (diff) | |
download | fmtlib-a1079e9fd6f01b6c33ad6da999d2538c0607bbb5.tar.gz |
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<char>::allocate` does
not use `this`, so it does not crash when `this` is null.
Fixes #1344
Diffstat (limited to 'test')
-rw-r--r-- | test/format-test.cc | 17 |
1 files 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<char> alloc; basic_memory_buffer<char, 5, TestAllocator> 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<char> alloc; + basic_memory_buffer<char, 4, TestAllocator> 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<char, 5, TestAllocator> buffer2(std::move(buffer)); + buffer.push_back('a'); + basic_memory_buffer<char, 4, TestAllocator> 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, |