Merge "Base: Fix dangling-else in CHECK_STROP"

This commit is contained in:
Treehugger Robot 2016-09-13 23:09:36 +00:00 committed by Gerrit Code Review
commit ad81a1d94a
2 changed files with 29 additions and 8 deletions

View file

@ -201,14 +201,13 @@ class ErrnoRestorer {
#define CHECK_GT(x, y) CHECK_OP(x, y, > )
// Helper for CHECK_STRxx(s1,s2) macros.
#define CHECK_STROP(s1, s2, sense) \
if (LIKELY((strcmp(s1, s2) == 0) == (sense))) \
; \
else \
ABORT_AFTER_LOG_FATAL \
LOG(FATAL) << "Check failed: " \
<< "\"" << (s1) << "\"" \
<< ((sense) ? " == " : " != ") << "\"" << (s2) << "\""
#define CHECK_STROP(s1, s2, sense) \
while (UNLIKELY((strcmp(s1, s2) == 0) != (sense))) \
ABORT_AFTER_LOG_FATAL \
::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.
#define CHECK_STREQ(s1, s2) CHECK_STROP(s1, s2, true)

View file

@ -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";