1*9356374aSAndroid Build Coastguard Worker // Copyright 2022 The Abseil Authors. 2*9356374aSAndroid Build Coastguard Worker // 3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*9356374aSAndroid Build Coastguard Worker // 7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*9356374aSAndroid Build Coastguard Worker // 9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*9356374aSAndroid Build Coastguard Worker // limitations under the License. 14*9356374aSAndroid Build Coastguard Worker // 15*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 16*9356374aSAndroid Build Coastguard Worker // File: log/check.h 17*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 18*9356374aSAndroid Build Coastguard Worker // 19*9356374aSAndroid Build Coastguard Worker // This header declares a family of `CHECK` macros. 20*9356374aSAndroid Build Coastguard Worker // 21*9356374aSAndroid Build Coastguard Worker // `CHECK` macros terminate the program with a fatal error if the specified 22*9356374aSAndroid Build Coastguard Worker // condition is not true. 23*9356374aSAndroid Build Coastguard Worker // 24*9356374aSAndroid Build Coastguard Worker // Except for those whose names begin with `DCHECK`, these macros are not 25*9356374aSAndroid Build Coastguard Worker // controlled by `NDEBUG` (cf. `assert`), so the check will be executed 26*9356374aSAndroid Build Coastguard Worker // regardless of compilation mode. `CHECK` and friends are thus useful for 27*9356374aSAndroid Build Coastguard Worker // confirming invariants in situations where continuing to run would be worse 28*9356374aSAndroid Build Coastguard Worker // than terminating, e.g., due to risk of data corruption or security 29*9356374aSAndroid Build Coastguard Worker // compromise. It is also more robust and portable to deliberately terminate 30*9356374aSAndroid Build Coastguard Worker // at a particular place with a useful message and backtrace than to assume some 31*9356374aSAndroid Build Coastguard Worker // ultimately unspecified and unreliable crashing behavior (such as a 32*9356374aSAndroid Build Coastguard Worker // "segmentation fault"). 33*9356374aSAndroid Build Coastguard Worker 34*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_LOG_CHECK_H_ 35*9356374aSAndroid Build Coastguard Worker #define ABSL_LOG_CHECK_H_ 36*9356374aSAndroid Build Coastguard Worker 37*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/check_impl.h" 38*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/check_op.h" // IWYU pragma: export 39*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/conditions.h" // IWYU pragma: export 40*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/log_message.h" // IWYU pragma: export 41*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/strip.h" // IWYU pragma: export 42*9356374aSAndroid Build Coastguard Worker 43*9356374aSAndroid Build Coastguard Worker // CHECK() 44*9356374aSAndroid Build Coastguard Worker // 45*9356374aSAndroid Build Coastguard Worker // `CHECK` terminates the program with a fatal error if `condition` is not true. 46*9356374aSAndroid Build Coastguard Worker // 47*9356374aSAndroid Build Coastguard Worker // The message may include additional information such as stack traces, when 48*9356374aSAndroid Build Coastguard Worker // available. 49*9356374aSAndroid Build Coastguard Worker // 50*9356374aSAndroid Build Coastguard Worker // Example: 51*9356374aSAndroid Build Coastguard Worker // 52*9356374aSAndroid Build Coastguard Worker // CHECK(!cheese.empty()) << "Out of Cheese"; 53*9356374aSAndroid Build Coastguard Worker // 54*9356374aSAndroid Build Coastguard Worker // Might produce a message like: 55*9356374aSAndroid Build Coastguard Worker // 56*9356374aSAndroid Build Coastguard Worker // Check failed: !cheese.empty() Out of Cheese 57*9356374aSAndroid Build Coastguard Worker #define CHECK(condition) ABSL_LOG_INTERNAL_CHECK_IMPL((condition), #condition) 58*9356374aSAndroid Build Coastguard Worker 59*9356374aSAndroid Build Coastguard Worker // QCHECK() 60*9356374aSAndroid Build Coastguard Worker // 61*9356374aSAndroid Build Coastguard Worker // `QCHECK` behaves like `CHECK` but does not print a full stack trace and does 62*9356374aSAndroid Build Coastguard Worker // not run registered error handlers (as `QFATAL`). It is useful when the 63*9356374aSAndroid Build Coastguard Worker // problem is definitely unrelated to program flow, e.g. when validating user 64*9356374aSAndroid Build Coastguard Worker // input. 65*9356374aSAndroid Build Coastguard Worker #define QCHECK(condition) ABSL_LOG_INTERNAL_QCHECK_IMPL((condition), #condition) 66*9356374aSAndroid Build Coastguard Worker 67*9356374aSAndroid Build Coastguard Worker // PCHECK() 68*9356374aSAndroid Build Coastguard Worker // 69*9356374aSAndroid Build Coastguard Worker // `PCHECK` behaves like `CHECK` but appends a description of the current state 70*9356374aSAndroid Build Coastguard Worker // of `errno` to the failure message. 71*9356374aSAndroid Build Coastguard Worker // 72*9356374aSAndroid Build Coastguard Worker // Example: 73*9356374aSAndroid Build Coastguard Worker // 74*9356374aSAndroid Build Coastguard Worker // int fd = open("/var/empty/missing", O_RDONLY); 75*9356374aSAndroid Build Coastguard Worker // PCHECK(fd != -1) << "posix is difficult"; 76*9356374aSAndroid Build Coastguard Worker // 77*9356374aSAndroid Build Coastguard Worker // Might produce a message like: 78*9356374aSAndroid Build Coastguard Worker // 79*9356374aSAndroid Build Coastguard Worker // Check failed: fd != -1 posix is difficult: No such file or directory [2] 80*9356374aSAndroid Build Coastguard Worker #define PCHECK(condition) ABSL_LOG_INTERNAL_PCHECK_IMPL((condition), #condition) 81*9356374aSAndroid Build Coastguard Worker 82*9356374aSAndroid Build Coastguard Worker // DCHECK() 83*9356374aSAndroid Build Coastguard Worker // 84*9356374aSAndroid Build Coastguard Worker // `DCHECK` behaves like `CHECK` in debug mode and does nothing otherwise (as 85*9356374aSAndroid Build Coastguard Worker // `DLOG`). Unlike with `CHECK` (but as with `assert`), it is not safe to rely 86*9356374aSAndroid Build Coastguard Worker // on evaluation of `condition`: when `NDEBUG` is enabled, DCHECK does not 87*9356374aSAndroid Build Coastguard Worker // evaluate the condition. 88*9356374aSAndroid Build Coastguard Worker #define DCHECK(condition) ABSL_LOG_INTERNAL_DCHECK_IMPL((condition), #condition) 89*9356374aSAndroid Build Coastguard Worker 90*9356374aSAndroid Build Coastguard Worker // `CHECK_EQ` and friends are syntactic sugar for `CHECK(x == y)` that 91*9356374aSAndroid Build Coastguard Worker // automatically output the expression being tested and the evaluated values on 92*9356374aSAndroid Build Coastguard Worker // either side. 93*9356374aSAndroid Build Coastguard Worker // 94*9356374aSAndroid Build Coastguard Worker // Example: 95*9356374aSAndroid Build Coastguard Worker // 96*9356374aSAndroid Build Coastguard Worker // int x = 3, y = 5; 97*9356374aSAndroid Build Coastguard Worker // CHECK_EQ(2 * x, y) << "oops!"; 98*9356374aSAndroid Build Coastguard Worker // 99*9356374aSAndroid Build Coastguard Worker // Might produce a message like: 100*9356374aSAndroid Build Coastguard Worker // 101*9356374aSAndroid Build Coastguard Worker // Check failed: 2 * x == y (6 vs. 5) oops! 102*9356374aSAndroid Build Coastguard Worker // 103*9356374aSAndroid Build Coastguard Worker // The values must implement the appropriate comparison operator as well as 104*9356374aSAndroid Build Coastguard Worker // `operator<<(std::ostream&, ...)`. Care is taken to ensure that each 105*9356374aSAndroid Build Coastguard Worker // argument is evaluated exactly once, and that anything which is legal to pass 106*9356374aSAndroid Build Coastguard Worker // as a function argument is legal here. In particular, the arguments may be 107*9356374aSAndroid Build Coastguard Worker // temporary expressions which will end up being destroyed at the end of the 108*9356374aSAndroid Build Coastguard Worker // statement, 109*9356374aSAndroid Build Coastguard Worker // 110*9356374aSAndroid Build Coastguard Worker // Example: 111*9356374aSAndroid Build Coastguard Worker // 112*9356374aSAndroid Build Coastguard Worker // CHECK_EQ(std::string("abc")[1], 'b'); 113*9356374aSAndroid Build Coastguard Worker // 114*9356374aSAndroid Build Coastguard Worker // WARNING: Passing `NULL` as an argument to `CHECK_EQ` and similar macros does 115*9356374aSAndroid Build Coastguard Worker // not compile. Use `nullptr` instead. 116*9356374aSAndroid Build Coastguard Worker #define CHECK_EQ(val1, val2) \ 117*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_EQ_IMPL((val1), #val1, (val2), #val2) 118*9356374aSAndroid Build Coastguard Worker #define CHECK_NE(val1, val2) \ 119*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_NE_IMPL((val1), #val1, (val2), #val2) 120*9356374aSAndroid Build Coastguard Worker #define CHECK_LE(val1, val2) \ 121*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_LE_IMPL((val1), #val1, (val2), #val2) 122*9356374aSAndroid Build Coastguard Worker #define CHECK_LT(val1, val2) \ 123*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_LT_IMPL((val1), #val1, (val2), #val2) 124*9356374aSAndroid Build Coastguard Worker #define CHECK_GE(val1, val2) \ 125*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_GE_IMPL((val1), #val1, (val2), #val2) 126*9356374aSAndroid Build Coastguard Worker #define CHECK_GT(val1, val2) \ 127*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_GT_IMPL((val1), #val1, (val2), #val2) 128*9356374aSAndroid Build Coastguard Worker #define QCHECK_EQ(val1, val2) \ 129*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_EQ_IMPL((val1), #val1, (val2), #val2) 130*9356374aSAndroid Build Coastguard Worker #define QCHECK_NE(val1, val2) \ 131*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_NE_IMPL((val1), #val1, (val2), #val2) 132*9356374aSAndroid Build Coastguard Worker #define QCHECK_LE(val1, val2) \ 133*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_LE_IMPL((val1), #val1, (val2), #val2) 134*9356374aSAndroid Build Coastguard Worker #define QCHECK_LT(val1, val2) \ 135*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_LT_IMPL((val1), #val1, (val2), #val2) 136*9356374aSAndroid Build Coastguard Worker #define QCHECK_GE(val1, val2) \ 137*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_GE_IMPL((val1), #val1, (val2), #val2) 138*9356374aSAndroid Build Coastguard Worker #define QCHECK_GT(val1, val2) \ 139*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_GT_IMPL((val1), #val1, (val2), #val2) 140*9356374aSAndroid Build Coastguard Worker #define DCHECK_EQ(val1, val2) \ 141*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_EQ_IMPL((val1), #val1, (val2), #val2) 142*9356374aSAndroid Build Coastguard Worker #define DCHECK_NE(val1, val2) \ 143*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_NE_IMPL((val1), #val1, (val2), #val2) 144*9356374aSAndroid Build Coastguard Worker #define DCHECK_LE(val1, val2) \ 145*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_LE_IMPL((val1), #val1, (val2), #val2) 146*9356374aSAndroid Build Coastguard Worker #define DCHECK_LT(val1, val2) \ 147*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_LT_IMPL((val1), #val1, (val2), #val2) 148*9356374aSAndroid Build Coastguard Worker #define DCHECK_GE(val1, val2) \ 149*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_GE_IMPL((val1), #val1, (val2), #val2) 150*9356374aSAndroid Build Coastguard Worker #define DCHECK_GT(val1, val2) \ 151*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_GT_IMPL((val1), #val1, (val2), #val2) 152*9356374aSAndroid Build Coastguard Worker 153*9356374aSAndroid Build Coastguard Worker // `CHECK_OK` and friends validate that the provided `absl::Status` or 154*9356374aSAndroid Build Coastguard Worker // `absl::StatusOr<T>` is OK. If it isn't, they print a failure message that 155*9356374aSAndroid Build Coastguard Worker // includes the actual status and terminate the program. 156*9356374aSAndroid Build Coastguard Worker // 157*9356374aSAndroid Build Coastguard Worker // As with all `DCHECK` variants, `DCHECK_OK` has no effect (not even 158*9356374aSAndroid Build Coastguard Worker // evaluating its argument) if `NDEBUG` is enabled. 159*9356374aSAndroid Build Coastguard Worker // 160*9356374aSAndroid Build Coastguard Worker // Example: 161*9356374aSAndroid Build Coastguard Worker // 162*9356374aSAndroid Build Coastguard Worker // CHECK_OK(FunctionReturnsStatus(x, y, z)) << "oops!"; 163*9356374aSAndroid Build Coastguard Worker // 164*9356374aSAndroid Build Coastguard Worker // Might produce a message like: 165*9356374aSAndroid Build Coastguard Worker // 166*9356374aSAndroid Build Coastguard Worker // Check failed: FunctionReturnsStatus(x, y, z) is OK (ABORTED: timeout) oops! 167*9356374aSAndroid Build Coastguard Worker #define CHECK_OK(status) ABSL_LOG_INTERNAL_CHECK_OK_IMPL((status), #status) 168*9356374aSAndroid Build Coastguard Worker #define QCHECK_OK(status) ABSL_LOG_INTERNAL_QCHECK_OK_IMPL((status), #status) 169*9356374aSAndroid Build Coastguard Worker #define DCHECK_OK(status) ABSL_LOG_INTERNAL_DCHECK_OK_IMPL((status), #status) 170*9356374aSAndroid Build Coastguard Worker 171*9356374aSAndroid Build Coastguard Worker // `CHECK_STREQ` and friends provide `CHECK_EQ` functionality for C strings, 172*9356374aSAndroid Build Coastguard Worker // i.e., null-terminated char arrays. The `CASE` versions are case-insensitive. 173*9356374aSAndroid Build Coastguard Worker // 174*9356374aSAndroid Build Coastguard Worker // Example: 175*9356374aSAndroid Build Coastguard Worker // 176*9356374aSAndroid Build Coastguard Worker // CHECK_STREQ(argv[0], "./skynet"); 177*9356374aSAndroid Build Coastguard Worker // 178*9356374aSAndroid Build Coastguard Worker // Note that both arguments may be temporary strings which are destroyed by the 179*9356374aSAndroid Build Coastguard Worker // compiler at the end of the current full expression. 180*9356374aSAndroid Build Coastguard Worker // 181*9356374aSAndroid Build Coastguard Worker // Example: 182*9356374aSAndroid Build Coastguard Worker // 183*9356374aSAndroid Build Coastguard Worker // CHECK_STREQ(Foo().c_str(), Bar().c_str()); 184*9356374aSAndroid Build Coastguard Worker #define CHECK_STREQ(s1, s2) \ 185*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_STREQ_IMPL((s1), #s1, (s2), #s2) 186*9356374aSAndroid Build Coastguard Worker #define CHECK_STRNE(s1, s2) \ 187*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_STRNE_IMPL((s1), #s1, (s2), #s2) 188*9356374aSAndroid Build Coastguard Worker #define CHECK_STRCASEEQ(s1, s2) \ 189*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_STRCASEEQ_IMPL((s1), #s1, (s2), #s2) 190*9356374aSAndroid Build Coastguard Worker #define CHECK_STRCASENE(s1, s2) \ 191*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_CHECK_STRCASENE_IMPL((s1), #s1, (s2), #s2) 192*9356374aSAndroid Build Coastguard Worker #define QCHECK_STREQ(s1, s2) \ 193*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_STREQ_IMPL((s1), #s1, (s2), #s2) 194*9356374aSAndroid Build Coastguard Worker #define QCHECK_STRNE(s1, s2) \ 195*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_STRNE_IMPL((s1), #s1, (s2), #s2) 196*9356374aSAndroid Build Coastguard Worker #define QCHECK_STRCASEEQ(s1, s2) \ 197*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_STRCASEEQ_IMPL((s1), #s1, (s2), #s2) 198*9356374aSAndroid Build Coastguard Worker #define QCHECK_STRCASENE(s1, s2) \ 199*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_QCHECK_STRCASENE_IMPL((s1), #s1, (s2), #s2) 200*9356374aSAndroid Build Coastguard Worker #define DCHECK_STREQ(s1, s2) \ 201*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_STREQ_IMPL((s1), #s1, (s2), #s2) 202*9356374aSAndroid Build Coastguard Worker #define DCHECK_STRNE(s1, s2) \ 203*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_STRNE_IMPL((s1), #s1, (s2), #s2) 204*9356374aSAndroid Build Coastguard Worker #define DCHECK_STRCASEEQ(s1, s2) \ 205*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_STRCASEEQ_IMPL((s1), #s1, (s2), #s2) 206*9356374aSAndroid Build Coastguard Worker #define DCHECK_STRCASENE(s1, s2) \ 207*9356374aSAndroid Build Coastguard Worker ABSL_LOG_INTERNAL_DCHECK_STRCASENE_IMPL((s1), #s1, (s2), #s2) 208*9356374aSAndroid Build Coastguard Worker 209*9356374aSAndroid Build Coastguard Worker #endif // ABSL_LOG_CHECK_H_ 210