Add Antithesis intrumentation (#5042)

* Copy Antithesis SDK version 0.4.0 to directory external/
* Add build option `voidstar` to enable instrumentation with Antithesis SDK
* Define instrumentation macros ASSERT and UNREACHABLE in terms of regular C assert
* Replace asserts with named ASSERT or UNREACHABLE
* Add UNREACHABLE to LogicError
* Document instrumentation macros in CONTRIBUTING.md
This commit is contained in:
Bronek Kozicki
2024-12-03 14:52:21 -05:00
committed by Ed Hennis
parent f64cf9187a
commit d7e949193f
261 changed files with 3848 additions and 1034 deletions

View File

@@ -55,7 +55,9 @@ TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj)
auto affectedNodes =
dynamic_cast<STArray const*>(obj.peekAtPField(sfAffectedNodes));
assert(affectedNodes);
ASSERT(
affectedNodes != nullptr,
"ripple::TxMeta::TxMeta(STObject) : type cast succeeded");
if (affectedNodes)
mNodes = *affectedNodes;
@@ -106,7 +108,9 @@ TxMeta::setAffectedNode(
mNodes.push_back(STObject(type));
STObject& obj = mNodes.back();
assert(obj.getFName() == type);
ASSERT(
obj.getFName() == type,
"ripple::TxMeta::setAffectedNode : field type match");
obj.setFieldH256(sfLedgerIndex, node);
obj.setFieldU16(sfLedgerEntryType, nodeType);
}
@@ -127,14 +131,18 @@ TxMeta::getAffectedAccounts() const
if (index != -1)
{
auto inner = dynamic_cast<STObject const*>(&it.peekAtIndex(index));
assert(inner);
ASSERT(
inner != nullptr,
"ripple::getAffectedAccounts : STObject type cast succeeded");
if (inner)
{
for (auto const& field : *inner)
{
if (auto sa = dynamic_cast<STAccount const*>(&field))
{
assert(!sa->isDefault());
ASSERT(
!sa->isDefault(),
"ripple::getAffectedAccounts : account is set");
if (!sa->isDefault())
list.insert(sa->value());
}
@@ -145,7 +153,10 @@ TxMeta::getAffectedAccounts() const
(field.getFName() == sfTakerGets))
{
auto lim = dynamic_cast<STAmount const*>(&field);
assert(lim);
ASSERT(
lim != nullptr,
"ripple::getAffectedAccounts : STAmount type cast "
"succeeded");
if (lim != nullptr)
{
@@ -175,7 +186,9 @@ TxMeta::getAffectedNode(SLE::ref node, SField const& type)
mNodes.push_back(STObject(type));
STObject& obj = mNodes.back();
assert(obj.getFName() == type);
ASSERT(
obj.getFName() == type,
"ripple::TxMeta::getAffectedNode(SLE::ref) : field type match");
obj.setFieldH256(sfLedgerIndex, index);
obj.setFieldU16(sfLedgerEntryType, node->getFieldU16(sfLedgerEntryType));
@@ -190,7 +203,7 @@ TxMeta::getAffectedNode(uint256 const& node)
if (n.getFieldH256(sfLedgerIndex) == node)
return n;
}
assert(false);
UNREACHABLE("ripple::TxMeta::getAffectedNode(uint256) : node not found");
Throw<std::runtime_error>("Affected node not found");
return *(mNodes.begin()); // Silence compiler warning.
}
@@ -199,7 +212,7 @@ STObject
TxMeta::getAsObject() const
{
STObject metaData(sfTransactionMetaData);
assert(mResult != 255);
ASSERT(mResult != 255, "ripple::TxMeta::getAsObject : result is set");
metaData.setFieldU8(sfTransactionResult, mResult);
metaData.setFieldU32(sfTransactionIndex, mIndex);
metaData.emplace_back(mNodes);
@@ -213,7 +226,9 @@ TxMeta::addRaw(Serializer& s, TER result, std::uint32_t index)
{
mResult = TERtoInt(result);
mIndex = index;
assert((mResult == 0) || ((mResult > 100) && (mResult <= 255)));
ASSERT(
(mResult == 0) || ((mResult > 100) && (mResult <= 255)),
"ripple::TxMeta::addRaw : valid TER input");
mNodes.sort([](STObject const& o1, STObject const& o2) {
return o1.getFieldH256(sfLedgerIndex) < o2.getFieldH256(sfLedgerIndex);