mirror of
https://github.com/dashpay/dash.git
synced 2024-12-24 19:42:46 +01:00
merge bitcoin#20255: Add Assume() identity function
This commit is contained in:
parent
ff4dc02ac6
commit
6d8839473c
@ -324,6 +324,7 @@ if test "x$enable_debug" = xyes; then
|
|||||||
|
|
||||||
AX_CHECK_PREPROC_FLAG([-DDEBUG_CORE],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG_CORE"]],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_PREPROC_FLAG([-DDEBUG_CORE],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG_CORE"]],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_PREPROC_FLAG([-DDEBUG_LOCKORDER],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG_LOCKORDER"]],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_PREPROC_FLAG([-DDEBUG_LOCKORDER],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG_LOCKORDER"]],,[[$CXXFLAG_WERROR]])
|
||||||
|
AX_CHECK_PREPROC_FLAG([-DABORT_ON_FAILED_ASSUME],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DABORT_ON_FAILED_ASSUME"]],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-ftrapv],[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -ftrapv"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-ftrapv],[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -ftrapv"],,[[$CXXFLAG_WERROR]])
|
||||||
else
|
else
|
||||||
# We always enable at at least -g1 debug info to support proper stacktraces in crash infos
|
# We always enable at at least -g1 debug info to support proper stacktraces in crash infos
|
||||||
@ -1233,6 +1234,8 @@ if test "x$enable_fuzz" = "xyes"; then
|
|||||||
use_natpmp=no
|
use_natpmp=no
|
||||||
use_zmq=no
|
use_zmq=no
|
||||||
|
|
||||||
|
AX_CHECK_PREPROC_FLAG([-DABORT_ON_FAILED_ASSUME],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DABORT_ON_FAILED_ASSUME"]],,[[$CXXFLAG_WERROR]])
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether main function is needed])
|
AC_MSG_CHECKING([whether main function is needed])
|
||||||
AX_CHECK_LINK_FLAG(
|
AX_CHECK_LINK_FLAG(
|
||||||
[[-fsanitize=$use_sanitizers]],
|
[[-fsanitize=$use_sanitizers]],
|
||||||
|
@ -277,6 +277,33 @@ configure option adds `-DDEBUG_LOCKORDER` to the compiler flags. This inserts
|
|||||||
run-time checks to keep track of which locks are held and adds warnings to the
|
run-time checks to keep track of which locks are held and adds warnings to the
|
||||||
`debug.log` file if inconsistencies are detected.
|
`debug.log` file if inconsistencies are detected.
|
||||||
|
|
||||||
|
### Assertions and Checks
|
||||||
|
|
||||||
|
The util file `src/util/check.h` offers helpers to protect against coding and
|
||||||
|
internal logic bugs. They must never be used to validate user, network or any
|
||||||
|
other input.
|
||||||
|
|
||||||
|
* `assert` or `Assert` should be used to document assumptions when any
|
||||||
|
violation would mean that it is not safe to continue program execution. The
|
||||||
|
code is always compiled with assertions enabled.
|
||||||
|
- For example, a nullptr dereference or any other logic bug in validation
|
||||||
|
code means the program code is faulty and must terminate immediately.
|
||||||
|
* `CHECK_NONFATAL` should be used for recoverable internal logic bugs. On
|
||||||
|
failure, it will throw an exception, which can be caught to recover from the
|
||||||
|
error.
|
||||||
|
- For example, a nullptr dereference or any other logic bug in RPC code
|
||||||
|
means that the RPC code is faulty and can not be executed. However, the
|
||||||
|
logic bug can be shown to the user and the program can continue to run.
|
||||||
|
* `Assume` should be used to document assumptions when program execution can
|
||||||
|
safely continue even if the assumption is violated. In debug builds it
|
||||||
|
behaves like `Assert`/`assert` to notify developers and testers about
|
||||||
|
nonfatal errors. In production it doesn't warn or log anything, though the
|
||||||
|
expression is always evaluated.
|
||||||
|
- For example it can be assumed that a variable is only initialized once,
|
||||||
|
but a failed assumption does not result in a fatal bug. A failed
|
||||||
|
assumption may or may not result in a slightly degraded user experience,
|
||||||
|
but it is safe to continue program execution.
|
||||||
|
|
||||||
### Valgrind suppressions file
|
### Valgrind suppressions file
|
||||||
|
|
||||||
Valgrind is a programming tool for memory debugging, memory leak detection, and
|
Valgrind is a programming tool for memory debugging, memory leak detection, and
|
||||||
|
@ -42,7 +42,7 @@ class NonFatalCheckError : public std::runtime_error
|
|||||||
#error "Cannot compile without assertions!"
|
#error "Cannot compile without assertions!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Helper for Assert(). TODO remove in C++14 and replace `decltype(get_pure_r_value(val))` with `T` (templated lambda) */
|
/** Helper for Assert() */
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T get_pure_r_value(T&& val)
|
T get_pure_r_value(T&& val)
|
||||||
{
|
{
|
||||||
@ -50,6 +50,22 @@ T get_pure_r_value(T&& val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Identity function. Abort if the value compares equal to zero */
|
/** Identity function. Abort if the value compares equal to zero */
|
||||||
#define Assert(val) [&]() -> decltype(get_pure_r_value(val)) { auto&& check = (val); assert(#val && check); return std::forward<decltype(get_pure_r_value(val))>(check); }()
|
#define Assert(val) ([&]() -> decltype(get_pure_r_value(val)) { auto&& check = (val); assert(#val && check); return std::forward<decltype(get_pure_r_value(val))>(check); }())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assume is the identity function.
|
||||||
|
*
|
||||||
|
* - Should be used to run non-fatal checks. In debug builds it behaves like
|
||||||
|
* Assert()/assert() to notify developers and testers about non-fatal errors.
|
||||||
|
* In production it doesn't warn or log anything.
|
||||||
|
* - For fatal errors, use Assert().
|
||||||
|
* - For non-fatal errors in interactive sessions (e.g. RPC or command line
|
||||||
|
* interfaces), CHECK_NONFATAL() might be more appropriate.
|
||||||
|
*/
|
||||||
|
#ifdef ABORT_ON_FAILED_ASSUME
|
||||||
|
#define Assume(val) Assert(val)
|
||||||
|
#else
|
||||||
|
#define Assume(val) ((void)(val))
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // BITCOIN_UTIL_CHECK_H
|
#endif // BITCOIN_UTIL_CHECK_H
|
||||||
|
Loading…
Reference in New Issue
Block a user