1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_NOTREACHED_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_NOTREACHED_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/logging_buildflags.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1520664): Remove once NOTIMPLEMENTED() call sites include 14*6777b538SAndroid Build Coastguard Worker // base/notimplemented.h. 15*6777b538SAndroid Build Coastguard Worker #include "base/notimplemented.h" 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace logging { 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker // NOTREACHED() annotates should-be unreachable code. When a base::NotFatalUntil 20*6777b538SAndroid Build Coastguard Worker // milestone is provided the instance is non-fatal (dumps without crashing) 21*6777b538SAndroid Build Coastguard Worker // until that milestone is hit. That is: `NOTREACHED(base::NotFatalUntil::M120)` 22*6777b538SAndroid Build Coastguard Worker // starts crashing in M120. See base/check.h. 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker // Under the kNotReachedIsFatal experiment all NOTREACHED() without a milestone 25*6777b538SAndroid Build Coastguard Worker // argument are fatal. As of 2024-03-19 this experiment is 50/50 enabled on M124 26*6777b538SAndroid Build Coastguard Worker // Canary and Dev with intent to roll out to stable in M124 absent any blocking 27*6777b538SAndroid Build Coastguard Worker // issues that come up. 28*6777b538SAndroid Build Coastguard Worker // 29*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/851128): After kNotReachedIsFatal is universally rolled out 30*6777b538SAndroid Build Coastguard Worker // then move callers without a non-fatal milestone argument to 31*6777b538SAndroid Build Coastguard Worker // NOTREACHED_NORETURN(). Then rename the [[noreturn]] version back to 32*6777b538SAndroid Build Coastguard Worker // NOTREACHED(). 33*6777b538SAndroid Build Coastguard Worker #if CHECK_WILL_STREAM() || BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) 34*6777b538SAndroid Build Coastguard Worker #define NOTREACHED(...) \ 35*6777b538SAndroid Build Coastguard Worker LOGGING_CHECK_FUNCTION_IMPL( \ 36*6777b538SAndroid Build Coastguard Worker ::logging::NotReachedError::NotReached(__VA_ARGS__), false) 37*6777b538SAndroid Build Coastguard Worker #else 38*6777b538SAndroid Build Coastguard Worker #define BASE_HAS_VA_ARGS(...) 1 39*6777b538SAndroid Build Coastguard Worker #define NOTREACHED(...) \ 40*6777b538SAndroid Build Coastguard Worker BASE_IF(BASE_IS_EMPTY(__VA_ARGS__), \ 41*6777b538SAndroid Build Coastguard Worker (true) ? ::logging::NotReachedError::TriggerNotReached() \ 42*6777b538SAndroid Build Coastguard Worker : EAT_CHECK_STREAM_PARAMS(), \ 43*6777b538SAndroid Build Coastguard Worker LOGGING_CHECK_FUNCTION_IMPL( \ 44*6777b538SAndroid Build Coastguard Worker ::logging::NotReachedError::NotReached(__VA_ARGS__), false)) 45*6777b538SAndroid Build Coastguard Worker #endif 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker // NOTREACHED_NORETURN() annotates paths that are supposed to be unreachable. 48*6777b538SAndroid Build Coastguard Worker // They crash if they are ever hit. 49*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/851128): Rename back to NOTREACHED() once there are no callers 50*6777b538SAndroid Build Coastguard Worker // of the old non-CHECK-fatal macro. 51*6777b538SAndroid Build Coastguard Worker #if CHECK_WILL_STREAM() 52*6777b538SAndroid Build Coastguard Worker #define NOTREACHED_NORETURN() ::logging::NotReachedNoreturnError() 53*6777b538SAndroid Build Coastguard Worker #else 54*6777b538SAndroid Build Coastguard Worker // This function is used to be able to detect NOTREACHED() failures in stack 55*6777b538SAndroid Build Coastguard Worker // traces where this symbol is preserved (even if inlined). Its implementation 56*6777b538SAndroid Build Coastguard Worker // matches logging::CheckFailure() but intentionally uses a different signature. 57*6777b538SAndroid Build Coastguard Worker [[noreturn]] IMMEDIATE_CRASH_ALWAYS_INLINE void NotReachedFailure() { 58*6777b538SAndroid Build Coastguard Worker base::ImmediateCrash(); 59*6777b538SAndroid Build Coastguard Worker } 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker #define NOTREACHED_NORETURN() \ 62*6777b538SAndroid Build Coastguard Worker (true) ? ::logging::NotReachedFailure() : EAT_CHECK_STREAM_PARAMS() 63*6777b538SAndroid Build Coastguard Worker #endif 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker // The DUMP_WILL_BE_NOTREACHED_NORETURN() macro provides a convenient way to 66*6777b538SAndroid Build Coastguard Worker // non-fatally dump in official builds if ever hit. See DUMP_WILL_BE_CHECK for 67*6777b538SAndroid Build Coastguard Worker // suggested usage. 68*6777b538SAndroid Build Coastguard Worker #define DUMP_WILL_BE_NOTREACHED_NORETURN() \ 69*6777b538SAndroid Build Coastguard Worker ::logging::CheckError::DumpWillBeNotReachedNoreturn() 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker } // namespace logging 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker #endif // BASE_NOTREACHED_H_ 74