Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d8f26e2a authored by Andreas Gampe's avatar Andreas Gampe
Browse files

Base: Fix dangling-else in CHECK_STROP

Follow-up to commit 2527628e.

Bug: 26962895
Bug: 31338270
Test: m
Test: mmma system/core/base && $ANDROID_HOST_OUT/nativetest64/libbase_test/libbase_test64
Change-Id: Ifd71314e146ebf3957cc053ee95ef85002c909b4
parent 07572a92
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -202,12 +202,11 @@ class ErrnoRestorer {

// Helper for CHECK_STRxx(s1,s2) macros.
#define CHECK_STROP(s1, s2, sense)                                             \
  if (LIKELY((strcmp(s1, s2) == 0) == (sense)))                            \
    ;                                                                      \
  else                                                                     \
  while (UNLIKELY((strcmp(s1, s2) == 0) != (sense)))                           \
    ABORT_AFTER_LOG_FATAL                                                      \
    LOG(FATAL) << "Check failed: "                                         \
               << "\"" << (s1) << "\""                                     \
    ::android::base::LogMessage(__FILE__, __LINE__, ::android::base::DEFAULT,  \
                                ::android::base::FATAL, -1).stream()           \
        << "Check failed: " << "\"" << (s1) << "\""                            \
        << ((sense) ? " == " : " != ") << "\"" << (s2) << "\""

// Check for string (const char*) equality between s1 and s2, LOG(FATAL) if not.
+22 −0
Original line number Diff line number Diff line
@@ -120,6 +120,28 @@ TEST(logging, CHECK) {
  EXPECT_FALSE(flag) << "CHECK_STREQ probably has a dangling if with no else";
}

TEST(logging, DCHECK) {
  if (android::base::kEnableDChecks) {
    ASSERT_DEATH({SuppressAbortUI(); DCHECK(false);}, "DCheck failed: false ");
  }
  DCHECK(true);

  if (android::base::kEnableDChecks) {
    ASSERT_DEATH({SuppressAbortUI(); DCHECK_EQ(0, 1);}, "DCheck failed: 0 == 1 ");
  }
  DCHECK_EQ(0, 0);

  if (android::base::kEnableDChecks) {
    ASSERT_DEATH({SuppressAbortUI(); DCHECK_STREQ("foo", "bar");},
                 R"(DCheck failed: "foo" == "bar")");
  }
  DCHECK_STREQ("foo", "foo");

  // No testing whether we have a dangling else, possibly. That's inherent to the if (constexpr)
  // setup we intentionally chose to force type-checks of debug code even in release builds (so
  // we don't get more bit-rot).
}

static std::string make_log_pattern(android::base::LogSeverity severity,
                                    const char* message) {
  static const char log_characters[] = "VDIWEFF";