From 74df6975aef6d6fa2020313922e9a94b42364f38 Mon Sep 17 00:00:00 2001 From: Derek Mauro Date: Thu, 14 Mar 2024 08:44:16 -0700 Subject: Add additional checks for size_t overflows This change mainly affects 32-bit platforms. Similar to 4618865caf8596742a9fd7c28a70a46b5e277794, check for size_t overflow in all places where string result sizes are precomputed before allocation. PiperOrigin-RevId: 615792028 Change-Id: I71c774c5ef2c2978bd812c70e9bab36d266b7c90 --- absl/strings/internal/str_join_internal.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'absl/strings/internal/str_join_internal.h') diff --git a/absl/strings/internal/str_join_internal.h b/absl/strings/internal/str_join_internal.h index d97d5033..96d41b68 100644 --- a/absl/strings/internal/str_join_internal.h +++ b/absl/strings/internal/str_join_internal.h @@ -31,13 +31,16 @@ #ifndef ABSL_STRINGS_INTERNAL_STR_JOIN_INTERNAL_H_ #define ABSL_STRINGS_INTERNAL_STR_JOIN_INTERNAL_H_ +#include #include #include +#include #include #include #include #include +#include "absl/base/internal/raw_logging.h" #include "absl/strings/internal/ostringstream.h" #include "absl/strings/internal/resize_uninitialized.h" #include "absl/strings/str_cat.h" @@ -230,14 +233,19 @@ std::string JoinAlgorithm(Iterator start, Iterator end, absl::string_view s, if (start != end) { // Sums size auto&& start_value = *start; - size_t result_size = start_value.size(); + // Use uint64_t to prevent size_t overflow. We assume it is not possible for + // in memory strings to overflow a uint64_t. + uint64_t result_size = start_value.size(); for (Iterator it = start; ++it != end;) { result_size += s.size(); result_size += (*it).size(); } if (result_size > 0) { - STLStringResizeUninitialized(&result, result_size); + constexpr uint64_t kMaxSize = + uint64_t{(std::numeric_limits::max)()}; + ABSL_INTERNAL_CHECK(result_size <= kMaxSize, "size_t overflow"); + STLStringResizeUninitialized(&result, static_cast(result_size)); // Joins strings char* result_buf = &*result.begin(); -- cgit v1.2.3 From 43c36ffae6256b4c93c1b9d3c73efaf8c2c891ab Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Tue, 19 Mar 2024 11:10:02 -0700 Subject: Add explicit #include directives for , "absl/base/config.h", and "absl/strings/string_view.h". PiperOrigin-RevId: 617232899 Change-Id: I5e6c0bd4545d7f7ad9c5c494017269e247f620a3 --- absl/strings/internal/str_join_internal.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'absl/strings/internal/str_join_internal.h') diff --git a/absl/strings/internal/str_join_internal.h b/absl/strings/internal/str_join_internal.h index 96d41b68..440d47ff 100644 --- a/absl/strings/internal/str_join_internal.h +++ b/absl/strings/internal/str_join_internal.h @@ -37,13 +37,16 @@ #include #include #include +#include #include #include +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/strings/internal/ostringstream.h" #include "absl/strings/internal/resize_uninitialized.h" #include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" namespace absl { ABSL_NAMESPACE_BEGIN -- cgit v1.2.3 From cbfe51b2c01da330ff292b145de91346a5950163 Mon Sep 17 00:00:00 2001 From: Valery Mironov <32071355+MBkkt@users.noreply.github.com> Date: Wed, 15 May 2024 09:55:15 -0700 Subject: PR #1672: Optimize StrJoin with tuple without user defined formatter Imported from GitHub PR https://github.com/abseil/abseil-cpp/pull/1672 https://github.com/abseil/abseil-cpp/discussions/1671 Merge ddcbb2466b2c9c4048d60be7e58cf47f935c257d into eba8db7baf6c326870f28e58977075b7b2fb243d Merging this change closes #1672 COPYBARA_INTEGRATE_REVIEW=https://github.com/abseil/abseil-cpp/pull/1672 from MBkkt:optimize-str-join ddcbb2466b2c9c4048d60be7e58cf47f935c257d PiperOrigin-RevId: 633988391 Change-Id: I2b3904211a29de3a768fb90a7fc106d7ff6c03e7 --- absl/strings/internal/str_join_internal.h | 10 ++++++++++ absl/strings/str_join.h | 3 ++- absl/strings/str_join_benchmark.cc | 10 ++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) (limited to 'absl/strings/internal/str_join_internal.h') diff --git a/absl/strings/internal/str_join_internal.h b/absl/strings/internal/str_join_internal.h index 440d47ff..3e730c7a 100644 --- a/absl/strings/internal/str_join_internal.h +++ b/absl/strings/internal/str_join_internal.h @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -321,6 +322,15 @@ std::string JoinRange(const Range& range, absl::string_view separator) { return JoinRange(begin(range), end(range), separator); } +template +std::string JoinTuple(const Tuple& value, absl::string_view separator, + std::index_sequence) { + return JoinRange( + std::initializer_list{ + static_cast(std::get(value)).Piece()...}, + separator); +} + } // namespace strings_internal ABSL_NAMESPACE_END } // namespace absl diff --git a/absl/strings/str_join.h b/absl/strings/str_join.h index badc944a..8d7bc6ba 100644 --- a/absl/strings/str_join.h +++ b/absl/strings/str_join.h @@ -291,7 +291,8 @@ inline std::string StrJoin(std::initializer_list il, template std::string StrJoin(const std::tuple& value, absl::string_view separator) { - return strings_internal::JoinAlgorithm(value, separator, AlphaNumFormatter()); + return strings_internal::JoinTuple(value, separator, + std::index_sequence_for{}); } ABSL_NAMESPACE_END diff --git a/absl/strings/str_join_benchmark.cc b/absl/strings/str_join_benchmark.cc index d6f689ff..be7a7257 100644 --- a/absl/strings/str_join_benchmark.cc +++ b/absl/strings/str_join_benchmark.cc @@ -16,6 +16,7 @@ #include "absl/strings/str_join.h" #include +#include #include #include @@ -94,4 +95,13 @@ BENCHMARK(BM_JoinStreamable) ->ArgPair(16, 256) ->ArgPair(256, 256); +void BM_JoinTuple(benchmark::State& state) { + for (auto _ : state) { + std::string s = + absl::StrJoin(std::make_tuple(123456789, 987654321, 24680, 13579), "/"); + benchmark::DoNotOptimize(s); + } +} +BENCHMARK(BM_JoinTuple); + } // namespace -- cgit v1.2.3