From e9403e2b032f97a72ebdfedc09b4dce2eb8b3f81 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 5 Nov 2020 10:50:19 +0100 Subject: [PATCH] AK: printf was not accounting for plus sign with "%+d" We have to include the plus sign in the number of characters written, otherwise sprintf() will put the null terminator too early. --- AK/PrintfImplementation.h | 2 +- AK/Tests/TestString.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/AK/PrintfImplementation.h b/AK/PrintfImplementation.h index d3d1545e62..0b202a2b79 100644 --- a/AK/PrintfImplementation.h +++ b/AK/PrintfImplementation.h @@ -284,7 +284,7 @@ ALWAYS_INLINE int print_signed_number(PutChFunc putch, char*& bufptr, int number } if (always_sign) putch(bufptr, '+'); - return print_number(putch, bufptr, number, left_pad, zero_pad, field_width); + return print_number(putch, bufptr, number, left_pad, zero_pad, field_width) + always_sign; } struct ModifierState { diff --git a/AK/Tests/TestString.cpp b/AK/Tests/TestString.cpp index f42ba3a928..250873c5d6 100644 --- a/AK/Tests/TestString.cpp +++ b/AK/Tests/TestString.cpp @@ -242,4 +242,18 @@ TEST_CASE(builder_zero_initial_capacity) EXPECT_EQ(built.length(), 0u); } +TEST_CASE(sprintf) +{ + char buf1[128]; + int ret1 = sprintf(buf1, "%+d", 12); + EXPECT_EQ(ret1, 3); + + char buf2[128]; + int ret2 = sprintf(buf2, "%+d", -12); + EXPECT_EQ(ret2, 3); + + EXPECT_EQ(String(buf1), String("+12")); + EXPECT_EQ(String(buf2), String("-12")); +} + TEST_MAIN(String)