Change abseil hardening assertions in the strings directory from macros to functions This associates debug information with the assertion sites, allowing clearer stack-traces for assertion failures and better accounting of the performance overhead of assertions. PiperOrigin-RevId: 910863016 Change-Id: Ic615a9eeb8ad4b3f8c035074df4ff8347190e5c7
diff --git a/absl/strings/BUILD.bazel b/absl/strings/BUILD.bazel index 79b6672..97187a5 100644 --- a/absl/strings/BUILD.bazel +++ b/absl/strings/BUILD.bazel
@@ -42,6 +42,7 @@ deps = [ "//absl/base:config", "//absl/base:core_headers", + "//absl/base:hardening", "//absl/base:nullability", ], ) @@ -106,6 +107,7 @@ "//absl/base:config", "//absl/base:core_headers", "//absl/base:endian", + "//absl/base:hardening", "//absl/base:iterator_traits_internal", "//absl/base:nullability", "//absl/base:raw_logging_internal", @@ -152,6 +154,7 @@ "//absl/base:config", "//absl/base:core_headers", "//absl/base:dynamic_annotations", + "//absl/base:hardening", "//absl/base:throw_delegate", ], ) @@ -180,6 +183,7 @@ ":resize_and_overwrite", "//absl/base:config", "//absl/base:core_headers", + "//absl/base:hardening", "//absl/base:throw_delegate", ], ) @@ -674,6 +678,7 @@ "//absl/base:config", "//absl/base:core_headers", "//absl/base:endian", + "//absl/base:hardening", "//absl/base:nullability", "//absl/base:raw_logging_internal", "//absl/cleanup", @@ -973,6 +978,7 @@ ":cord_rep_test_util", ":string_view", "//absl/base:config", + "//absl/base:hardening", "//absl/types:span", "@googletest//:gtest", "@googletest//:gtest_main",
diff --git a/absl/strings/CMakeLists.txt b/absl/strings/CMakeLists.txt index 9f7f9ef..3041e19 100644 --- a/absl/strings/CMakeLists.txt +++ b/absl/strings/CMakeLists.txt
@@ -81,6 +81,7 @@ absl::config absl::core_headers absl::endian + absl::hardening absl::int128 absl::iterator_traits_internal absl::memory @@ -179,6 +180,7 @@ absl::config absl::core_headers absl::dynamic_annotations + absl::hardening absl::throw_delegate ) @@ -206,6 +208,7 @@ DEPS absl::config absl::core_headers + absl::hardening absl::strings_resize_and_overwrite absl::throw_delegate ) @@ -1075,6 +1078,7 @@ absl::crc_cord_state absl::endian absl::function_ref + absl::hardening absl::inlined_vector absl::nullability absl::optional
diff --git a/absl/strings/cord.cc b/absl/strings/cord.cc index aa450d3..1d5e255 100644 --- a/absl/strings/cord.cc +++ b/absl/strings/cord.cc
@@ -35,6 +35,7 @@ #include "absl/base/attributes.h" #include "absl/base/config.h" #include "absl/base/internal/endian.h" +#include "absl/base/internal/hardening.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/macros.h" #include "absl/base/nullability.h" @@ -1086,8 +1087,8 @@ } Cord Cord::ChunkIterator::AdvanceAndReadBytes(size_t n) { - ABSL_HARDENING_ASSERT(bytes_remaining_ >= n && - "Attempted to iterate past `end()`"); + // Failure of this assertion indicates an attempt to iterate past `end()`. + absl::base_internal::HardeningAssertGE(bytes_remaining_, n); Cord subcord; auto constexpr method = CordzUpdateTracker::kCordReader; @@ -1155,7 +1156,7 @@ } char Cord::operator[](size_t i) const { - ABSL_HARDENING_ASSERT(i < size()); + absl::base_internal::HardeningAssertLT(i, size()); size_t offset = i; const CordRep* rep = contents_.tree(); if (rep == nullptr) {
diff --git a/absl/strings/cord.h b/absl/strings/cord.h index c2f1ec5..4f27fca 100644 --- a/absl/strings/cord.h +++ b/absl/strings/cord.h
@@ -75,6 +75,7 @@ #include "absl/base/attributes.h" #include "absl/base/config.h" #include "absl/base/internal/endian.h" +#include "absl/base/internal/hardening.h" #include "absl/base/macros.h" #include "absl/base/nullability.h" #include "absl/base/optimization.h" @@ -1553,8 +1554,8 @@ } inline Cord::ChunkIterator& Cord::ChunkIterator::operator++() { - ABSL_HARDENING_ASSERT(bytes_remaining_ > 0 && - "Attempted to iterate past `end()`"); + // Failure of this assertion indicates an attempt to iterate past `end()`. + absl::base_internal::HardeningAssertGT(bytes_remaining_, size_t{0}); assert(bytes_remaining_ >= current_chunk_.size()); bytes_remaining_ -= current_chunk_.size(); if (bytes_remaining_ > 0) { @@ -1583,12 +1584,12 @@ } inline Cord::ChunkIterator::reference Cord::ChunkIterator::operator*() const { - ABSL_HARDENING_ASSERT(bytes_remaining_ != 0); + absl::base_internal::HardeningAssertGT(bytes_remaining_, size_t{0}); return current_chunk_; } inline Cord::ChunkIterator::pointer Cord::ChunkIterator::operator->() const { - ABSL_HARDENING_ASSERT(bytes_remaining_ != 0); + absl::base_internal::HardeningAssertGT(bytes_remaining_, size_t{0}); return ¤t_chunk_; }
diff --git a/absl/strings/cord_buffer.h b/absl/strings/cord_buffer.h index bc0e4e4..fc806bb 100644 --- a/absl/strings/cord_buffer.h +++ b/absl/strings/cord_buffer.h
@@ -32,6 +32,7 @@ #include <utility> #include "absl/base/config.h" +#include "absl/base/internal/hardening.h" #include "absl/base/macros.h" #include "absl/numeric/bits.h" #include "absl/strings/internal/cord_internal.h" @@ -549,7 +550,7 @@ } inline void CordBuffer::SetLength(size_t length) { - ABSL_HARDENING_ASSERT(length <= capacity()); + absl::base_internal::HardeningAssertLE(length, capacity()); if (rep_.is_short()) { rep_.set_short_length(length); } else { @@ -558,7 +559,8 @@ } inline void CordBuffer::IncreaseLengthBy(size_t n) { - ABSL_HARDENING_ASSERT(n <= capacity() && length() + n <= capacity()); + absl::base_internal::HardeningAssertLE(n, capacity()); + absl::base_internal::HardeningAssertLE(length() + n, capacity()); if (rep_.is_short()) { rep_.add_short_length(n); } else {
diff --git a/absl/strings/internal/append_and_overwrite.h b/absl/strings/internal/append_and_overwrite.h index 7d4ce59..833d70d 100644 --- a/absl/strings/internal/append_and_overwrite.h +++ b/absl/strings/internal/append_and_overwrite.h
@@ -16,6 +16,7 @@ #define ABSL_STRINGS_INTERNAL_APPEND_AND_OVERWRITE_H_ #include "absl/base/config.h" +#include "absl/base/internal/hardening.h" #include "absl/base/macros.h" #include "absl/base/optimization.h" #include "absl/base/throw_delegate.h" @@ -69,9 +70,11 @@ str, resize, [old_size, append_n, do_append = std::move(append_op)]( typename T::value_type* data_ptr, typename T::size_type) mutable { - auto num_appended = - std::move(do_append)(data_ptr + old_size, append_n); - ABSL_HARDENING_ASSERT(num_appended >= 0 && num_appended <= append_n); + typename T::size_type num_appended = static_cast<typename T::size_type>( + std::move(do_append)(data_ptr + old_size, append_n)); + absl::base_internal::HardeningAssertGE(num_appended, + typename T::size_type{0}); + absl::base_internal::HardeningAssertLE(num_appended, append_n); return old_size + num_appended; });
diff --git a/absl/strings/resize_and_overwrite.h b/absl/strings/resize_and_overwrite.h index 102b2bf..4d2e2b8 100644 --- a/absl/strings/resize_and_overwrite.h +++ b/absl/strings/resize_and_overwrite.h
@@ -53,6 +53,7 @@ #include "absl/base/config.h" #include "absl/base/dynamic_annotations.h" +#include "absl/base/internal/hardening.h" #include "absl/base/macros.h" #include "absl/base/optimization.h" #include "absl/base/throw_delegate.h" @@ -135,10 +136,13 @@ ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(str.data() + old_size, n - old_size); } #endif - auto new_size = std::move(op)(str.data(), n); - ABSL_HARDENING_ASSERT(new_size >= 0 && new_size <= n); - ABSL_HARDENING_ASSERT(str.data()[n] == typename T::value_type{}); - str.erase(static_cast<typename T::size_type>(new_size)); + typename T::size_type new_size = + static_cast<typename T::size_type>(std::move(op)(str.data(), n)); + absl::base_internal::HardeningAssertGE(new_size, typename T::size_type{0}); + absl::base_internal::HardeningAssertLE(new_size, n); + absl::base_internal::HardeningAssert(str.data()[n] == + typename T::value_type{}); + str.erase(new_size); } template <typename T, typename Op>