Fix Unreachable() test to property EXPECT_DEATH in NDEBUG mode.

EXPECT_DEBUG_DEATH runs the statement without expecting a death in NDEBUG mode, causing a test failure in asan due to reaching `__builtin_unreachable`.
Also, improve a bit the definition of Unreachable to be more readable/useful.

PiperOrigin-RevId: 584133307
pull/14802/head
Protobuf Team Bot 1 year ago committed by Copybara-Service
parent 0fab773c1d
commit 5ae9efc02c
  1. 18
      src/google/protobuf/port.h
  2. 13
      src/google/protobuf/port_test.cc

@ -202,17 +202,21 @@ inline constexpr bool DebugHardenStringValues() {
#endif
}
#if ABSL_HAVE_BUILTIN(__builtin_FILE) && ABSL_HAVE_BUILTIN(__builtin_LINE)
[[noreturn]] inline void Unreachable(const char* file = __builtin_FILE(),
int line = __builtin_LINE()) {
#else
[[noreturn]] inline void Unreachable(const char* file = "", int line = 0) {
#endif
#if defined(NDEBUG) && ABSL_HAVE_BUILTIN(__builtin_unreachable)
[[noreturn]] ABSL_ATTRIBUTE_COLD PROTOBUF_ALWAYS_INLINE inline void
Unreachable() {
__builtin_unreachable();
#endif
}
#elif ABSL_HAVE_BUILTIN(__builtin_FILE) && ABSL_HAVE_BUILTIN(__builtin_LINE)
[[noreturn]] ABSL_ATTRIBUTE_COLD inline void Unreachable(
const char* file = __builtin_FILE(), int line = __builtin_LINE()) {
protobuf_assumption_failed("Unreachable", file, line);
}
#else
[[noreturn]] ABSL_ATTRIBUTE_COLD inline void Unreachable() {
protobuf_assumption_failed("Unreachable", "", 0);
}
#endif
} // namespace internal
} // namespace protobuf

@ -33,10 +33,15 @@ TEST(PortTest, ProtobufAssume) {
TEST(PortTest, UnreachableTrapsOnDebugMode) {
#ifdef GTEST_HAS_DEATH_TEST
EXPECT_DEBUG_DEATH(Unreachable(), "Assumption failed: 'Unreachable'");
#if ABSL_HAVE_BUILTIN(__builtin_FILE)
EXPECT_DEBUG_DEATH(Unreachable(),
"port_test\\.cc:.*Assumption failed: 'Unreachable'");
#if defined(NDEBUG)
// In NDEBUG we crash with a UD instruction, so we don't get the "Assumption
// failed" error.
GTEST_SKIP() << "Can't test __builtin_unreachable()";
#elif ABSL_HAVE_BUILTIN(__builtin_FILE)
EXPECT_DEATH(Unreachable(),
"port_test\\.cc:.*Assumption failed: 'Unreachable'");
#else
EXPECT_DEATH(Unreachable(), "Assumption failed: 'Unreachable'");
#endif
#endif
}

Loading…
Cancel
Save