mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-18 18:15:50 +00:00
- Added a new Invariant: `ValidPseudoAccounts` which checks that all pseudo-accounts behave consistently through creation and updates, and that no "real" accounts look like pseudo-accounts (which means they don't have a 0 sequence).
- `to_short_string(base_uint)`. Like `to_string`, but only returns the first 8 characters. (Similar to how a git commit ID can be abbreviated.) Used as a wrapped sink to prefix most transaction-related messages. More can be added later.
- `XRPL_ASSERT_PARTS`. Convenience wrapper for `XRPL_ASSERT`, which takes the `function` and `description` as separate parameters.
- `SField::sMD_PseudoAccount`. Metadata option for `SField` definitions to indicate that the field, if set in an `AccountRoot` indicates that account is a pseudo-account. Removes the need for hard-coded field lists all over the place. Added the flag to `AMMID` and `VaultID`.
- Added functionality to `SField` ctor to detect both code and name collisions using asserts. And require all SFields to have a name
- Convenience type aliases `STLedgerEntry::const_pointer` and `STLedgerEntry::const_ref`. (`SLE` is an alias to `STLedgerEntry`.)
- Generalized `feeunit.h` (`TaggedFee`) into `unit.h` (`ValueUnit`) and added new "BIPS"-related tags for future use. Also refactored the type restrictions to use Concepts.
- Restructured `transactions.macro` to do two big things
1. Include the `#include` directives for transactor header files directly in the macro file. Removes the need to update `applySteps.cpp` and the resulting conflicts.
2. Added a `privileges` parameter to the `TRANSACTION` macro, which specifies some of the operations a transaction is allowed to do. These `privileges` are enforced by invariant checks. Again, removed the need to update scattered lists of transaction types in various checks.
- Unit tests:
1. Moved more helper functions into `TestHelpers.h` and `.cpp`.
2. Cleaned up the namespaces to prevent / mitigate random collisions and ambiguous symbols, particularly in unity builds.
3. Generalized `Env::balance` to add support for `MPTIssue` and `Asset`.
4. Added a set of helper classes to simplify `Env` transaction parameter classes: `JTxField`, `JTxFieldWrapper`, and a bunch of classes derived or aliased from it. For an example of how awesome it is, check the changes `src/test/jtx/escrow.h` for how much simpler the definitions are for `finish_time`, `cancel_time`, `condition`, and `fulfillment`.
5. Generalized several of the amount-related helper classes to understand `Asset`s.
6. `env.balance` for an MPT issuer will return a negative number (or 0) for consistency with IOUs.
76 lines
3.4 KiB
C++
76 lines
3.4 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
This file is part of rippled: https://github.com/ripple/rippled
|
|
Copyright (c) 2024 Ripple Labs Inc.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
//==============================================================================
|
|
|
|
#ifndef BEAST_UTILITY_INSTRUMENTATION_H_INCLUDED
|
|
#define BEAST_UTILITY_INSTRUMENTATION_H_INCLUDED
|
|
|
|
#include <cassert>
|
|
|
|
#ifdef ENABLE_VOIDSTAR
|
|
#ifdef NDEBUG
|
|
#error "Antithesis instrumentation requires Debug build"
|
|
#endif
|
|
#include <antithesis_sdk.h>
|
|
#else
|
|
// Macros below are copied from antithesis_sdk.h and slightly simplified
|
|
// The duplication is because Visual Studio 2019 cannot compile that header
|
|
// even with the option -Zc:__cplusplus added.
|
|
#define ALWAYS(cond, message, ...) assert((message) && (cond))
|
|
#define ALWAYS_OR_UNREACHABLE(cond, message, ...) assert((message) && (cond))
|
|
#define SOMETIMES(cond, message, ...)
|
|
#define REACHABLE(message, ...)
|
|
#define UNREACHABLE(message, ...) assert((message) && false)
|
|
#endif
|
|
|
|
#define XRPL_ASSERT ALWAYS_OR_UNREACHABLE
|
|
#define XRPL_ASSERT_PARTS(cond, function, description, ...) \
|
|
XRPL_ASSERT(cond, function " : " description)
|
|
|
|
// How to use the instrumentation macros:
|
|
//
|
|
// * XRPL_ASSERT if cond must be true but the line might not be reached during
|
|
// fuzzing. Same like `assert` in normal use.
|
|
// * XRPL_ASSERT_PARTS is for convenience, and works like XRPL_ASSERT, but
|
|
// splits the message param into "function" and "description", then joins
|
|
// them with " : " before passing to XRPL_ASSERT.
|
|
// * ALWAYS if cond must be true _and_ the line must be reached during fuzzing.
|
|
// Same like `assert` in normal use.
|
|
// * REACHABLE if the line must be reached during fuzzing
|
|
// * SOMETIMES a hint for the fuzzer to try to make the cond true
|
|
// * UNREACHABLE if the line must not be reached (in fuzzing or in normal use).
|
|
// Same like `assert(false)` in normal use.
|
|
//
|
|
// NOTE: XRPL_ASSERT has similar semantics as C `assert` macro, with only minor
|
|
// differences:
|
|
// * XRPL_ASSERT must have an unique name (naming convention in CONTRIBUTING.md)
|
|
// * during fuzzing, the program will continue execution past failed XRPL_ASSERT
|
|
//
|
|
// We continue to use regular C `assert` inside unit tests and inside constexpr
|
|
// functions.
|
|
//
|
|
// NOTE: UNREACHABLE does *not* have the same semantics as std::unreachable.
|
|
// The program will continue execution past an UNREACHABLE in a Release build
|
|
// and during fuzzing (similar to failed XRPL_ASSERT).
|
|
// Also, the naming convention in UNREACHABLE is subtly different from other
|
|
// instrumentation macros - its name describes the condition which was _not_
|
|
// meant to happen, while name in other macros describes the condition that is
|
|
// meant to happen (e.g. as in "assert that this happens").
|
|
|
|
#endif
|