From 66936d3e8ff691e0f1536b7f2bb39bcf1df0eee6 Mon Sep 17 00:00:00 2001 From: Orivej Desh Date: Tue, 8 Oct 2019 09:10:51 +0000 Subject: [PATCH] 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/printf-test.cc | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) 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/printf-test.cc b/test/printf-test.cc index d8fbc964..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,