From b66bb6b71feac52f86dbe7424a4db200154fc7f0 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Tue, 8 Oct 2019 13:28:39 +0000 Subject: [PATCH] Fix undefined in core-test and printf-test (#1345) * Fix undefined in core-test Fixes "reference binding to null pointer" in BufferTest.Ctor buffer.operator[] attempts to return a reference to `buffer.ptr_[0]` when `ptr_` in `mock_buffer buffer` is null. * Fix undefined in printf-test Fixes "signed integer overflow" in PrintfTest.Length This occurs in `TestLength("ll")`, since its minimum value minus one does not fit in long long. * Fix undefined in printf %0$ Printf counts arguments from 1. Fixes "shift exponent -4 is negative" in PrintfTest.InvalidArgIndex. `do_get` is called with index -1 when `basic_printf_context.arg` is called with id 4294967295 when basic_printf_context::get_arg subtracts 1 from arg_index 0 in the format string "%0$d". --- include/fmt/printf.h | 2 ++ test/core-test.cc | 2 +- test/printf-test.cc | 6 ++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/fmt/printf.h b/include/fmt/printf.h index 18f8d121..6c7e328f 100644 --- a/include/fmt/printf.h +++ b/include/fmt/printf.h @@ -469,6 +469,8 @@ OutputIt basic_printf_context::format() { // Parse argument index, flags and width. unsigned arg_index = parse_header(it, end, specs); + if (arg_index == 0) + on_error("argument index 0 is out of range"); // Parse precision. if (it != end && *it == '.') { diff --git a/test/core-test.cc b/test/core-test.cc index 84d2b9eb..76612b99 100644 --- a/test/core-test.cc +++ b/test/core-test.cc @@ -103,7 +103,7 @@ template struct mock_buffer : buffer { TEST(BufferTest, Ctor) { { mock_buffer buffer; - EXPECT_EQ(nullptr, &buffer[0]); + EXPECT_EQ(nullptr, buffer.data()); EXPECT_EQ(static_cast(0), buffer.size()); EXPECT_EQ(static_cast(0), buffer.capacity()); } diff --git a/test/printf-test.cc b/test/printf-test.cc index cd9950d1..f158a627 100644 --- a/test/printf-test.cc +++ b/test/printf-test.cc @@ -112,7 +112,7 @@ TEST(PrintfTest, SwitchArgIndexing) { TEST(PrintfTest, InvalidArgIndex) { EXPECT_THROW_MSG(test_sprintf("%0$d", 42), format_error, - "argument index out of range"); + "argument index 0 is out of range"); EXPECT_THROW_MSG(test_sprintf("%2$d", 42), format_error, "argument index out of range"); EXPECT_THROW_MSG(test_sprintf(format("%{}$d", INT_MAX), 42), format_error, @@ -337,7 +337,9 @@ template void TestLength(const char* length_spec) { TestLength(length_spec, -42); TestLength(length_spec, min); TestLength(length_spec, max); - TestLength(length_spec, static_cast(min) - 1); + long long long_long_min = std::numeric_limits::min(); + if (static_cast(min) > long_long_min) + TestLength(length_spec, static_cast(min) - 1); unsigned long long long_long_max = max_value(); if (static_cast(max) < long_long_max) TestLength(length_spec, static_cast(max) + 1);