summaryrefslogtreecommitdiff
path: root/debian/patches/str-format-convert-test-printf.diff
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/str-format-convert-test-printf.diff')
-rw-r--r--debian/patches/str-format-convert-test-printf.diff103
1 files changed, 103 insertions, 0 deletions
diff --git a/debian/patches/str-format-convert-test-printf.diff b/debian/patches/str-format-convert-test-printf.diff
new file mode 100644
index 00000000..1808f2e1
--- /dev/null
+++ b/debian/patches/str-format-convert-test-printf.diff
@@ -0,0 +1,103 @@
+From: Benjamin Barenblat <bbaren@google.com>
+Subject: Check printf format strings in str_format_convert_test
+Forwarded: yes
+Applied-Upstream: https://github.com/abseil/abseil-cpp/commit/9fed77a6fea29b8c8468bd41c6259c7f67163a65
+
+Add ABSL_PRINTF_ATTRIBUTE to appropriate functions in
+strings/internal/str_format/convert_test. Correct
+TypedFormatConvertTest.Char, which was accidentally passing values of
+types larger than int to StrPrint.
+
+The author works at Google. Upstream applied this patch as Piper
+revision 439388148 and exported it to GitHub; the Applied-Upstream URL
+above points to the exported commit.
+
+--- a/absl/strings/BUILD.bazel
++++ b/absl/strings/BUILD.bazel
+@@ -787,6 +787,7 @@
+ deps = [
+ ":str_format_internal",
+ ":strings",
++ "//absl/base:core_headers",
+ "//absl/base:raw_logging_internal",
+ "//absl/types:optional",
+ "@com_google_googletest//:gtest_main",
+--- a/absl/strings/CMakeLists.txt
++++ b/absl/strings/CMakeLists.txt
+@@ -492,6 +492,7 @@
+ DEPS
+ absl::strings
+ absl::str_format_internal
++ absl::core_headers
+ absl::raw_logging_internal
+ absl::int128
+ gmock_main
+--- a/absl/strings/internal/str_format/convert_test.cc
++++ b/absl/strings/internal/str_format/convert_test.cc
+@@ -24,6 +24,7 @@
+
+ #include "gmock/gmock.h"
+ #include "gtest/gtest.h"
++#include "absl/base/attributes.h"
+ #include "absl/base/internal/raw_logging.h"
+ #include "absl/strings/internal/str_format/bind.h"
+ #include "absl/strings/match.h"
+@@ -124,6 +125,7 @@
+ delete[] buf;
+ }
+
++void StrAppend(std::string *, const char *, ...) ABSL_PRINTF_ATTRIBUTE(2, 3);
+ void StrAppend(std::string *out, const char *format, ...) {
+ va_list ap;
+ va_start(ap, format);
+@@ -131,6 +133,7 @@
+ va_end(ap);
+ }
+
++std::string StrPrint(const char *, ...) ABSL_PRINTF_ATTRIBUTE(1, 2);
+ std::string StrPrint(const char *format, ...) {
+ va_list ap;
+ va_start(ap, format);
+@@ -452,21 +455,32 @@
+ }
+
+ TYPED_TEST_P(TypedFormatConvertTest, Char) {
++ // Pass a bunch of values of type TypeParam to both FormatPack and libc's
++ // vsnprintf("%c", ...) (wrapped in StrPrint) to make sure we get the same
++ // value.
+ typedef TypeParam T;
+ using remove_volatile_t = typename std::remove_volatile<T>::type;
+- static const T kMin = std::numeric_limits<remove_volatile_t>::min();
+- static const T kMax = std::numeric_limits<remove_volatile_t>::max();
+- T kVals[] = {
+- remove_volatile_t(1), remove_volatile_t(2), remove_volatile_t(10),
+- remove_volatile_t(-1), remove_volatile_t(-2), remove_volatile_t(-10),
+- remove_volatile_t(0),
+- kMin + remove_volatile_t(1), kMin,
+- kMax - remove_volatile_t(1), kMax
++ std::vector<remove_volatile_t> vals = {
++ remove_volatile_t(1), remove_volatile_t(2), remove_volatile_t(10), //
++ remove_volatile_t(-1), remove_volatile_t(-2), remove_volatile_t(-10), //
++ remove_volatile_t(0),
+ };
+- for (const T &c : kVals) {
++
++ // We'd like to test values near std::numeric_limits::min() and
++ // std::numeric_limits::max(), too, but vsnprintf("%c", ...) can't handle
++ // anything larger than an int. Add in the most extreme values we can without
++ // exceeding that range.
++ static const T kMin =
++ static_cast<remove_volatile_t>(std::numeric_limits<int>::min());
++ static const T kMax =
++ static_cast<remove_volatile_t>(std::numeric_limits<int>::max());
++ vals.insert(vals.end(), {kMin + 1, kMin, kMax - 1, kMax});
++
++ for (const T c : vals) {
+ const FormatArgImpl args[] = {FormatArgImpl(c)};
+ UntypedFormatSpecImpl format("%c");
+- EXPECT_EQ(StrPrint("%c", c), FormatPack(format, absl::MakeSpan(args)));
++ EXPECT_EQ(StrPrint("%c", static_cast<int>(c)),
++ FormatPack(format, absl::MakeSpan(args)));
+ }
+ }
+