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 &current_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>