mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #10023 from ethereum/develop
Merge develop into breaking.
This commit is contained in:
commit
f6e57a0eec
@ -22,6 +22,8 @@ Language Features:
|
|||||||
|
|
||||||
Compiler Features:
|
Compiler Features:
|
||||||
* SMTChecker: Support inline arrays.
|
* SMTChecker: Support inline arrays.
|
||||||
|
* Control Flow Graph: Print warning for non-empty functions with unnamed return parameters that are not assigned a value in all code paths.
|
||||||
|
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
* Code generator: Fix internal compiler error when referencing members via module name but not using the reference.
|
* Code generator: Fix internal compiler error when referencing members via module name but not using the reference.
|
||||||
|
@ -424,6 +424,8 @@ operations as long as there is enough gas passed on to it.
|
|||||||
// If someone sends Ether to that contract, the receive function in TestPayable will be called.
|
// If someone sends Ether to that contract, the receive function in TestPayable will be called.
|
||||||
require(address(test).send(2 ether));
|
require(address(test).send(2 ether));
|
||||||
// results in test.x becoming == 2 and test.y becoming 2 ether.
|
// results in test.x becoming == 2 and test.y becoming 2 ether.
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,13 +37,13 @@ bool ControlFlowAnalyzer::visit(FunctionDefinition const& _function)
|
|||||||
if (_function.isImplemented())
|
if (_function.isImplemented())
|
||||||
{
|
{
|
||||||
auto const& functionFlow = m_cfg.functionFlow(_function);
|
auto const& functionFlow = m_cfg.functionFlow(_function);
|
||||||
checkUninitializedAccess(functionFlow.entry, functionFlow.exit);
|
checkUninitializedAccess(functionFlow.entry, functionFlow.exit, _function.body().statements().empty());
|
||||||
checkUnreachable(functionFlow.entry, functionFlow.exit, functionFlow.revert, functionFlow.transactionReturn);
|
checkUnreachable(functionFlow.entry, functionFlow.exit, functionFlow.revert, functionFlow.transactionReturn);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNode const* _exit) const
|
void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNode const* _exit, bool _emptyBody) const
|
||||||
{
|
{
|
||||||
struct NodeInfo
|
struct NodeInfo
|
||||||
{
|
{
|
||||||
@ -95,10 +95,6 @@ void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNod
|
|||||||
case VariableOccurrence::Kind::Return:
|
case VariableOccurrence::Kind::Return:
|
||||||
if (unassignedVariables.count(&variableOccurrence.declaration()))
|
if (unassignedVariables.count(&variableOccurrence.declaration()))
|
||||||
{
|
{
|
||||||
if (
|
|
||||||
variableOccurrence.declaration().type()->dataStoredIn(DataLocation::Storage) ||
|
|
||||||
variableOccurrence.declaration().type()->dataStoredIn(DataLocation::CallData)
|
|
||||||
)
|
|
||||||
// Merely store the unassigned access. We do not generate an error right away, since this
|
// Merely store the unassigned access. We do not generate an error right away, since this
|
||||||
// path might still always revert. It is only an error if this is propagated to the exit
|
// path might still always revert. It is only an error if this is propagated to the exit
|
||||||
// node of the function (i.e. there is a path with an uninitialized access).
|
// node of the function (i.e. there is a path with an uninitialized access).
|
||||||
@ -140,6 +136,8 @@ void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNod
|
|||||||
ssl.append("The variable was declared here.", variableOccurrence->declaration().location());
|
ssl.append("The variable was declared here.", variableOccurrence->declaration().location());
|
||||||
|
|
||||||
bool isStorage = variableOccurrence->declaration().type()->dataStoredIn(DataLocation::Storage);
|
bool isStorage = variableOccurrence->declaration().type()->dataStoredIn(DataLocation::Storage);
|
||||||
|
bool isCalldata = variableOccurrence->declaration().type()->dataStoredIn(DataLocation::CallData);
|
||||||
|
if (isStorage || isCalldata)
|
||||||
m_errorReporter.typeError(
|
m_errorReporter.typeError(
|
||||||
3464_error,
|
3464_error,
|
||||||
variableOccurrence->occurrence() ?
|
variableOccurrence->occurrence() ?
|
||||||
@ -152,6 +150,12 @@ void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNod
|
|||||||
(variableOccurrence->kind() == VariableOccurrence::Kind::Return ? "returned" : "accessed") +
|
(variableOccurrence->kind() == VariableOccurrence::Kind::Return ? "returned" : "accessed") +
|
||||||
" without prior assignment, which would lead to undefined behaviour."
|
" without prior assignment, which would lead to undefined behaviour."
|
||||||
);
|
);
|
||||||
|
else if (!_emptyBody && variableOccurrence->declaration().name().empty())
|
||||||
|
m_errorReporter.warning(
|
||||||
|
6321_error,
|
||||||
|
variableOccurrence->declaration().location(),
|
||||||
|
"Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable."
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
/// Checks for uninitialized variable accesses in the control flow between @param _entry and @param _exit.
|
/// Checks for uninitialized variable accesses in the control flow between @param _entry and @param _exit.
|
||||||
void checkUninitializedAccess(CFGNode const* _entry, CFGNode const* _exit) const;
|
void checkUninitializedAccess(CFGNode const* _entry, CFGNode const* _exit, bool _emptyBody) const;
|
||||||
/// Checks for unreachable code, i.e. code ending in @param _exit, @param _revert or @param _transactionReturn
|
/// Checks for unreachable code, i.e. code ending in @param _exit, @param _revert or @param _transactionReturn
|
||||||
/// that can not be reached from @param _entry.
|
/// that can not be reached from @param _entry.
|
||||||
void checkUnreachable(CFGNode const* _entry, CFGNode const* _exit, CFGNode const* _revert, CFGNode const* _transactionReturn) const;
|
void checkUnreachable(CFGNode const* _entry, CFGNode const* _exit, CFGNode const* _revert, CFGNode const* _transactionReturn) const;
|
||||||
|
@ -64,7 +64,7 @@ smtutil::Expression constructor(Predicate const& _pred, ContractDefinition const
|
|||||||
return _pred(currentFunctionVariables(*constructor, &_contract, _context));
|
return _pred(currentFunctionVariables(*constructor, &_contract, _context));
|
||||||
|
|
||||||
auto& state = _context.state();
|
auto& state = _context.state();
|
||||||
vector<smtutil::Expression> stateExprs{state.errorFlag().currentValue(), state.thisAddress(0), state.state()};
|
vector<smtutil::Expression> stateExprs{state.errorFlag().currentValue(), state.thisAddress(0), state.state(0), state.state()};
|
||||||
return _pred(stateExprs + currentStateVariables(_contract, _context));
|
return _pred(stateExprs + currentStateVariables(_contract, _context));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ SortPointer constructorSort(ContractDefinition const& _contract, SymbolicState&
|
|||||||
return functionSort(*constructor, &_contract, _state);
|
return functionSort(*constructor, &_contract, _state);
|
||||||
|
|
||||||
return make_shared<FunctionSort>(
|
return make_shared<FunctionSort>(
|
||||||
vector<SortPointer>{_state.errorFlagSort(), _state.thisAddressSort(), _state.stateSort()} + stateSorts(_contract),
|
vector<SortPointer>{_state.errorFlagSort(), _state.thisAddressSort(), _state.stateSort(), _state.stateSort()} + stateSorts(_contract),
|
||||||
SortProvider::boolSort
|
SortProvider::boolSort
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,23 @@ vector<Statement> generateMemoryStore(
|
|||||||
}});
|
}});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FunctionCall generateMemoryLoad(Dialect const& _dialect, langutil::SourceLocation const& _loc, YulString _mpos)
|
||||||
|
{
|
||||||
|
BuiltinFunction const* memoryLoadFunction = _dialect.memoryLoadFunction(_dialect.defaultType);
|
||||||
|
yulAssert(memoryLoadFunction, "");
|
||||||
|
return FunctionCall{
|
||||||
|
_loc,
|
||||||
|
Identifier{_loc, memoryLoadFunction->name}, {
|
||||||
|
Literal{
|
||||||
|
_loc,
|
||||||
|
LiteralKind::Number,
|
||||||
|
_mpos,
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StackToMemoryMover::run(
|
void StackToMemoryMover::run(
|
||||||
@ -93,29 +110,34 @@ void StackToMemoryMover::operator()(FunctionDefinition& _functionDefinition)
|
|||||||
void StackToMemoryMover::operator()(Block& _block)
|
void StackToMemoryMover::operator()(Block& _block)
|
||||||
{
|
{
|
||||||
using OptionalStatements = std::optional<vector<Statement>>;
|
using OptionalStatements = std::optional<vector<Statement>>;
|
||||||
auto containsVariableNeedingEscalation = [&](auto const& _variables) {
|
auto rewriteAssignmentOrVariableDeclaration = [&](
|
||||||
return util::contains_if(_variables, [&](auto const& var) {
|
auto& _stmt,
|
||||||
|
auto const& _variables
|
||||||
|
) -> OptionalStatements {
|
||||||
|
using StatementType = decay_t<decltype(_stmt)>;
|
||||||
|
if (_stmt.value)
|
||||||
|
visit(*_stmt.value);
|
||||||
|
bool leftHandSideNeedsMoving = util::contains_if(_variables, [&](auto const& var) {
|
||||||
return m_memoryOffsetTracker(var.name);
|
return m_memoryOffsetTracker(var.name);
|
||||||
});
|
});
|
||||||
};
|
if (!leftHandSideNeedsMoving)
|
||||||
auto rewriteAssignmentOrVariableDeclaration = [&](
|
return {};
|
||||||
langutil::SourceLocation const& _loc,
|
|
||||||
auto const& _variables,
|
langutil::SourceLocation loc = _stmt.location;
|
||||||
std::unique_ptr<Expression> _value
|
|
||||||
) -> std::vector<Statement> {
|
|
||||||
if (_variables.size() == 1)
|
if (_variables.size() == 1)
|
||||||
{
|
{
|
||||||
optional<YulString> offset = m_memoryOffsetTracker(_variables.front().name);
|
optional<YulString> offset = m_memoryOffsetTracker(_variables.front().name);
|
||||||
yulAssert(offset, "");
|
yulAssert(offset, "");
|
||||||
return generateMemoryStore(
|
return generateMemoryStore(
|
||||||
m_context.dialect,
|
m_context.dialect,
|
||||||
_loc,
|
loc,
|
||||||
*offset,
|
*offset,
|
||||||
_value ? *std::move(_value) : Literal{_loc, LiteralKind::Number, "0"_yulstring, {}}
|
_stmt.value ? *std::move(_stmt.value) : Literal{loc, LiteralKind::Number, "0"_yulstring, {}}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
VariableDeclaration tempDecl{_loc, {}, std::move(_value)};
|
VariableDeclaration tempDecl{loc, {}, std::move(_stmt.value)};
|
||||||
vector<Statement> memoryAssignments;
|
vector<Statement> memoryAssignments;
|
||||||
vector<Statement> variableAssignments;
|
vector<Statement> variableAssignments;
|
||||||
for (auto& var: _variables)
|
for (auto& var: _variables)
|
||||||
@ -126,19 +148,14 @@ void StackToMemoryMover::operator()(Block& _block)
|
|||||||
if (optional<YulString> offset = m_memoryOffsetTracker(var.name))
|
if (optional<YulString> offset = m_memoryOffsetTracker(var.name))
|
||||||
memoryAssignments += generateMemoryStore(
|
memoryAssignments += generateMemoryStore(
|
||||||
m_context.dialect,
|
m_context.dialect,
|
||||||
_loc,
|
loc,
|
||||||
*offset,
|
*offset,
|
||||||
Identifier{_loc, tempVarName}
|
Identifier{loc, tempVarName}
|
||||||
);
|
);
|
||||||
else if constexpr (std::is_same_v<std::decay_t<decltype(var)>, Identifier>)
|
|
||||||
variableAssignments.emplace_back(Assignment{
|
|
||||||
_loc, { Identifier{var.location, var.name} },
|
|
||||||
make_unique<Expression>(Identifier{_loc, tempVarName})
|
|
||||||
});
|
|
||||||
else
|
else
|
||||||
variableAssignments.emplace_back(VariableDeclaration{
|
variableAssignments.emplace_back(StatementType{
|
||||||
_loc, {std::move(var)},
|
loc, {move(var)},
|
||||||
make_unique<Expression>(Identifier{_loc, tempVarName})
|
make_unique<Expression>(Identifier{loc, tempVarName})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
std::vector<Statement> result;
|
std::vector<Statement> result;
|
||||||
@ -147,65 +164,34 @@ void StackToMemoryMover::operator()(Block& _block)
|
|||||||
result += std::move(memoryAssignments);
|
result += std::move(memoryAssignments);
|
||||||
std::reverse(variableAssignments.begin(), variableAssignments.end());
|
std::reverse(variableAssignments.begin(), variableAssignments.end());
|
||||||
result += std::move(variableAssignments);
|
result += std::move(variableAssignments);
|
||||||
return result;
|
return OptionalStatements{move(result)};
|
||||||
};
|
};
|
||||||
|
|
||||||
util::iterateReplacing(
|
util::iterateReplacing(
|
||||||
_block.statements,
|
_block.statements,
|
||||||
[&](Statement& _statement)
|
[&](Statement& _statement)
|
||||||
{
|
{
|
||||||
auto defaultVisit = [&]() { ASTModifier::visit(_statement); return OptionalStatements{}; };
|
|
||||||
return std::visit(util::GenericVisitor{
|
return std::visit(util::GenericVisitor{
|
||||||
[&](Assignment& _assignment) -> OptionalStatements
|
[&](Assignment& _assignment) -> OptionalStatements
|
||||||
{
|
{
|
||||||
if (!containsVariableNeedingEscalation(_assignment.variableNames))
|
return rewriteAssignmentOrVariableDeclaration(_assignment, _assignment.variableNames);
|
||||||
return defaultVisit();
|
|
||||||
visit(*_assignment.value);
|
|
||||||
return {rewriteAssignmentOrVariableDeclaration(
|
|
||||||
_assignment.location,
|
|
||||||
_assignment.variableNames,
|
|
||||||
std::move(_assignment.value)
|
|
||||||
)};
|
|
||||||
},
|
},
|
||||||
[&](VariableDeclaration& _varDecl) -> OptionalStatements
|
[&](VariableDeclaration& _varDecl) -> OptionalStatements
|
||||||
{
|
{
|
||||||
if (!containsVariableNeedingEscalation(_varDecl.variables))
|
return rewriteAssignmentOrVariableDeclaration(_varDecl, _varDecl.variables);
|
||||||
return defaultVisit();
|
|
||||||
if (_varDecl.value)
|
|
||||||
visit(*_varDecl.value);
|
|
||||||
return {rewriteAssignmentOrVariableDeclaration(
|
|
||||||
_varDecl.location,
|
|
||||||
_varDecl.variables,
|
|
||||||
std::move(_varDecl.value)
|
|
||||||
)};
|
|
||||||
},
|
},
|
||||||
[&](auto&) { return defaultVisit(); }
|
[&](auto& _stmt) -> OptionalStatements { (*this)(_stmt); return {}; }
|
||||||
}, _statement);
|
}, _statement);
|
||||||
});
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StackToMemoryMover::visit(Expression& _expression)
|
void StackToMemoryMover::visit(Expression& _expression)
|
||||||
{
|
{
|
||||||
|
ASTModifier::visit(_expression);
|
||||||
if (Identifier* identifier = std::get_if<Identifier>(&_expression))
|
if (Identifier* identifier = std::get_if<Identifier>(&_expression))
|
||||||
if (optional<YulString> offset = m_memoryOffsetTracker(identifier->name))
|
if (optional<YulString> offset = m_memoryOffsetTracker(identifier->name))
|
||||||
{
|
_expression = generateMemoryLoad(m_context.dialect, identifier->location, *offset);
|
||||||
BuiltinFunction const* memoryLoadFunction = m_context.dialect.memoryLoadFunction(m_context.dialect.defaultType);
|
|
||||||
yulAssert(memoryLoadFunction, "");
|
|
||||||
langutil::SourceLocation loc = identifier->location;
|
|
||||||
_expression = FunctionCall{
|
|
||||||
loc,
|
|
||||||
Identifier{loc, memoryLoadFunction->name}, {
|
|
||||||
Literal{
|
|
||||||
loc,
|
|
||||||
LiteralKind::Number,
|
|
||||||
*offset,
|
|
||||||
{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ASTModifier::visit(_expression);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<YulString> StackToMemoryMover::VariableMemoryOffsetTracker::operator()(YulString _variable) const
|
optional<YulString> StackToMemoryMover::VariableMemoryOffsetTracker::operator()(YulString _variable) const
|
||||||
|
@ -126,7 +126,7 @@ void OptimiserSuite::run(
|
|||||||
{
|
{
|
||||||
yulAssert(_meter, "");
|
yulAssert(_meter, "");
|
||||||
ConstantOptimiser{*dialect, *_meter}(ast);
|
ConstantOptimiser{*dialect, *_meter}(ast);
|
||||||
if (dialect->providesObjectAccess())
|
if (dialect->providesObjectAccess() && _optimizeStackAllocation)
|
||||||
StackLimitEvader::run(suite.m_context, _object, CompilabilityChecker{
|
StackLimitEvader::run(suite.m_context, _object, CompilabilityChecker{
|
||||||
_dialect,
|
_dialect,
|
||||||
_object,
|
_object,
|
||||||
|
@ -4,8 +4,8 @@ pragma solidity >=0.0;
|
|||||||
contract Arraysum {
|
contract Arraysum {
|
||||||
uint256[] values;
|
uint256[] values;
|
||||||
|
|
||||||
function sumArray() public view returns(uint) {
|
function sumArray() public view returns(uint sum) {
|
||||||
uint sum = 0;
|
sum = 0;
|
||||||
// The optimizer should read the length of the array only once, because
|
// The optimizer should read the length of the array only once, because
|
||||||
// LoopInvariantCodeMotion can move the `sload` corresponding to the length outside of the
|
// LoopInvariantCodeMotion can move the `sload` corresponding to the length outside of the
|
||||||
// loop.
|
// loop.
|
||||||
|
@ -43,7 +43,7 @@ object "Arraysum_33" {
|
|||||||
vloc_sum := add(vloc_sum, _3)
|
vloc_sum := add(vloc_sum, _3)
|
||||||
}
|
}
|
||||||
let memPos := allocateMemory(_1)
|
let memPos := allocateMemory(_1)
|
||||||
return(memPos, sub(abi_encode_uint(memPos, _1), memPos))
|
return(memPos, sub(abi_encode_uint(memPos, vloc_sum), memPos))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
revert(0, 0)
|
revert(0, 0)
|
||||||
|
@ -7,6 +7,7 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (117-121): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 2072: (133-143): Unused local variable.
|
// Warning 2072: (133-143): Unused local variable.
|
||||||
// Warning 8364: (146-147): Assertion checker does not yet implement type type(struct C.A storage pointer)
|
// Warning 8364: (146-147): Assertion checker does not yet implement type type(struct C.A storage pointer)
|
||||||
// Warning 4639: (146-163): Assertion checker does not yet implement this expression.
|
// Warning 4639: (146-163): Assertion checker does not yet implement this expression.
|
||||||
|
@ -30,4 +30,5 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (429-442): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (448-465): CHC: Assertion violation happens here.
|
// Warning 6328: (448-465): CHC: Assertion violation happens here.
|
||||||
|
@ -32,4 +32,5 @@ contract C {
|
|||||||
// ----
|
// ----
|
||||||
// Warning 5740: (116-129): Unreachable code.
|
// Warning 5740: (116-129): Unreachable code.
|
||||||
// Warning 5740: (221-234): Unreachable code.
|
// Warning 5740: (221-234): Unreachable code.
|
||||||
|
// Warning 6321: (408-421): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (427-444): CHC: Assertion violation happens here.
|
// Warning 6328: (427-444): CHC: Assertion violation happens here.
|
||||||
|
@ -8,5 +8,6 @@ contract C {
|
|||||||
// ====
|
// ====
|
||||||
// EVMVersion: >=byzantium
|
// EVMVersion: >=byzantium
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (75-79): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 7645: (98-121): Assertion checker does not support try/catch clauses.
|
// Warning 7645: (98-121): Assertion checker does not support try/catch clauses.
|
||||||
// Warning 7645: (124-159): Assertion checker does not support try/catch clauses.
|
// Warning 7645: (124-159): Assertion checker does not support try/catch clauses.
|
||||||
|
@ -13,3 +13,4 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (85-89): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -7,3 +7,4 @@ contract c {
|
|||||||
bool b = (f() > 0) || (f() > 0);
|
bool b = (f() > 0) || (f() > 0);
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (86-90): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -9,3 +9,5 @@ contract C {
|
|||||||
}
|
}
|
||||||
//
|
//
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (81-85): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (87-91): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -23,5 +23,18 @@ a;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (163-167): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (171-175): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (179-183): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (187-191): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (195-199): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (203-207): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (211-215): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (219-223): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (227-231): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (235-239): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (241-244): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (246-250): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (252-259): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6133: (72-90): Statement has no effect.
|
// Warning 6133: (72-90): Statement has no effect.
|
||||||
// Warning 6133: (96-107): Statement has no effect.
|
// Warning 6133: (96-107): Statement has no effect.
|
||||||
|
@ -21,6 +21,7 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (253-260): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 1218: (94-109): CHC: Error trying to invoke SMT solver.
|
// Warning 1218: (94-109): CHC: Error trying to invoke SMT solver.
|
||||||
// Warning 1218: (113-126): CHC: Error trying to invoke SMT solver.
|
// Warning 1218: (113-126): CHC: Error trying to invoke SMT solver.
|
||||||
// Warning 1218: (180-195): CHC: Error trying to invoke SMT solver.
|
// Warning 1218: (180-195): CHC: Error trying to invoke SMT solver.
|
||||||
|
@ -11,4 +11,5 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (83-87): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (203-217): CHC: Assertion violation happens here.
|
// Warning 6328: (203-217): CHC: Assertion violation happens here.
|
||||||
|
@ -11,4 +11,5 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (83-87): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (203-217): CHC: Assertion violation happens here.
|
// Warning 6328: (203-217): CHC: Assertion violation happens here.
|
||||||
|
@ -11,4 +11,5 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (83-87): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (204-221): CHC: Assertion violation happens here.
|
// Warning 6328: (204-221): CHC: Assertion violation happens here.
|
||||||
|
@ -14,6 +14,7 @@ contract C
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (87-91): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 4984: (117-122): CHC: Overflow (resulting value larger than 127) happens here.
|
// Warning 4984: (117-122): CHC: Overflow (resulting value larger than 127) happens here.
|
||||||
// Warning 4984: (151-158): CHC: Overflow (resulting value larger than 127) happens here.
|
// Warning 4984: (151-158): CHC: Overflow (resulting value larger than 127) happens here.
|
||||||
// Warning 3944: (197-205): CHC: Underflow (resulting value less than -128) happens here.
|
// Warning 3944: (197-205): CHC: Underflow (resulting value less than -128) happens here.
|
||||||
|
@ -25,4 +25,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (280-284): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (430-434): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (440-449): CHC: Assertion violation happens here.
|
// Warning 6328: (440-449): CHC: Assertion violation happens here.
|
||||||
|
@ -36,4 +36,5 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (655-662): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (668-677): CHC: Assertion violation happens here.
|
// Warning 6328: (668-677): CHC: Assertion violation happens here.
|
||||||
|
@ -10,6 +10,7 @@ contract test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (115-119): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6133: (125-126): Statement has no effect.
|
// Warning 6133: (125-126): Statement has no effect.
|
||||||
// Warning 6133: (130-136): Statement has no effect.
|
// Warning 6133: (130-136): Statement has no effect.
|
||||||
// Warning 6133: (140-144): Statement has no effect.
|
// Warning 6133: (140-144): Statement has no effect.
|
||||||
|
@ -7,4 +7,5 @@ contract c {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (80-84): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (128-142): CHC: Assertion violation happens here.
|
// Warning 6328: (128-142): CHC: Assertion violation happens here.
|
||||||
|
@ -8,4 +8,5 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (79-82): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (157-171): CHC: Assertion violation happens here.
|
// Warning 6328: (157-171): CHC: Assertion violation happens here.
|
||||||
|
@ -8,4 +8,5 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (79-82): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6328: (159-173): CHC: Assertion violation happens here.
|
// Warning 6328: (159-173): CHC: Assertion violation happens here.
|
||||||
|
@ -5,3 +5,5 @@ contract C {
|
|||||||
((, a)) = (1, 2);
|
((, a)) = (1, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (80-83): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -5,3 +5,5 @@ contract C {
|
|||||||
(((, a),)) = ((1, 2), 3);
|
(((, a),)) = ((1, 2), 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (80-83): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -5,3 +5,5 @@ contract C {
|
|||||||
(((((((, a),)))))) = ((1, 2), 3);
|
(((((((, a),)))))) = ((1, 2), 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (80-83): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -5,3 +5,5 @@ contract C {
|
|||||||
((((((, a)))),)) = ((1, 2), 3);
|
((((((, a)))),)) = ((1, 2), 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (80-83): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -5,3 +5,5 @@ contract C {
|
|||||||
((((((((((((, a))))))),))))) = ((1, 2), 3);
|
((((((((((((, a))))))),))))) = ((1, 2), 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (80-83): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -10,4 +10,5 @@ contract C {
|
|||||||
// ====
|
// ====
|
||||||
// EVMVersion: >=byzantium
|
// EVMVersion: >=byzantium
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (150-154): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 2072: (166-183): Unused local variable.
|
// Warning 2072: (166-183): Unused local variable.
|
||||||
|
@ -17,3 +17,4 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (399-407): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -4,3 +4,6 @@ contract C {
|
|||||||
function h() public pure returns(uint[] memory) {}
|
function h() public pure returns(uint[] memory) {}
|
||||||
function i() external pure returns(uint[] memory) {}
|
function i() external pure returns(uint[] memory) {}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (51-64): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (134-147): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -4,4 +4,5 @@ contract C {
|
|||||||
struct S { uint x; }
|
struct S { uint x; }
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (22-26): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// TypeError 3464: (45-46): This variable is of storage pointer type and can be accessed without prior assignment, which would lead to undefined behaviour.
|
// TypeError 3464: (45-46): This variable is of storage pointer type and can be accessed without prior assignment, which would lead to undefined behaviour.
|
||||||
|
@ -4,4 +4,5 @@ contract Test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (54-66): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6133: (78-88): Statement has no effect.
|
// Warning 6133: (78-88): Statement has no effect.
|
||||||
|
@ -4,3 +4,5 @@ contract C {
|
|||||||
a;
|
a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (46-50): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -9,3 +9,7 @@ contract C {
|
|||||||
function g() internal pure returns (uint, uint, uint, D.S[20] storage x, uint) { x = x; }
|
function g() internal pure returns (uint, uint, uint, D.S[20] storage x, uint) { x = x; }
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (176-180): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (182-186): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (188-192): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (213-217): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -10,3 +10,8 @@ contract C {
|
|||||||
function h() internal pure returns (bytes memory, string storage s) { s = s; }
|
function h() internal pure returns (bytes memory, string storage s) { s = s; }
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (51-55): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (57-61): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (63-67): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (69-73): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (250-262): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -8,3 +8,5 @@ contract Second {
|
|||||||
if (First(2).fun() == true) return 1;
|
if (First(2).fun() == true) return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (183-187): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -9,6 +9,7 @@ contract test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (83-87): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 6133: (93-94): Statement has no effect.
|
// Warning 6133: (93-94): Statement has no effect.
|
||||||
// Warning 6133: (98-104): Statement has no effect.
|
// Warning 6133: (98-104): Statement has no effect.
|
||||||
// Warning 6133: (108-112): Statement has no effect.
|
// Warning 6133: (108-112): Statement has no effect.
|
||||||
|
@ -4,3 +4,5 @@ contract C {
|
|||||||
function (address payable) payable external returns (address payable) h; h;
|
function (address payable) payable external returns (address payable) h; h;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (197-267): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -4,5 +4,6 @@ contract test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (60-64): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 2072: (109-115): Unused local variable.
|
// Warning 2072: (109-115): Unused local variable.
|
||||||
// Warning 2018: (20-128): Function state mutability can be restricted to pure
|
// Warning 2018: (20-128): Function state mutability can be restricted to pure
|
||||||
|
@ -11,4 +11,6 @@ contract C {
|
|||||||
// ====
|
// ====
|
||||||
// EVMVersion: >=byzantium
|
// EVMVersion: >=byzantium
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (73-77): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (79-83): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
// Warning 2072: (122-134): Unused local variable.
|
// Warning 2072: (122-134): Unused local variable.
|
||||||
|
@ -9,3 +9,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
// ====
|
// ====
|
||||||
// EVMVersion: >=byzantium
|
// EVMVersion: >=byzantium
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (46-50): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (52-56): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -9,3 +9,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
// ====
|
// ====
|
||||||
// EVMVersion: >=byzantium
|
// EVMVersion: >=byzantium
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (46-50): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (52-56): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -9,3 +9,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
// ====
|
// ====
|
||||||
// EVMVersion: >=byzantium
|
// EVMVersion: >=byzantium
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (46-50): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (52-56): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -7,3 +7,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (46-50): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (52-56): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -8,3 +8,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (46-50): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (52-56): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -9,3 +9,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
// ====
|
// ====
|
||||||
// EVMVersion: >=byzantium
|
// EVMVersion: >=byzantium
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (46-59): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (61-65): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -9,3 +9,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
// ====
|
// ====
|
||||||
// EVMVersion: >=byzantium
|
// EVMVersion: >=byzantium
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (46-59): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (61-65): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -12,3 +12,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
// ====
|
// ====
|
||||||
// EVMVersion: >=byzantium
|
// EVMVersion: >=byzantium
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (46-50): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (52-56): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -21,3 +21,6 @@ contract C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
|
// Warning 6321: (194-198): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (200-204): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
// Warning 6321: (206-213): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -6,3 +6,5 @@ contract C {
|
|||||||
g.selector;
|
g.selector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (51-57): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -4,3 +4,5 @@ contract C {
|
|||||||
function h() public { h(); g(); f(); }
|
function h() public { h(); g(); f(); }
|
||||||
function i() payable public { i(); h(); g(); f(); }
|
function i() payable public { i(); h(); g(); f(); }
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 6321: (89-93): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.
|
||||||
|
@ -218,7 +218,7 @@ string BytesUtils::formatRawBytes(
|
|||||||
auto it = _bytes.begin();
|
auto it = _bytes.begin();
|
||||||
|
|
||||||
if (_bytes.size() != ContractABIUtils::encodingSize(_parameters))
|
if (_bytes.size() != ContractABIUtils::encodingSize(_parameters))
|
||||||
parameters = ContractABIUtils::defaultParameters(ceil(_bytes.size() / 32));
|
parameters = ContractABIUtils::defaultParameters((_bytes.size() + 31) / 32);
|
||||||
else
|
else
|
||||||
parameters = _parameters;
|
parameters = _parameters;
|
||||||
|
|
||||||
@ -320,7 +320,7 @@ string BytesUtils::formatBytesRange(
|
|||||||
auto it = _bytes.begin();
|
auto it = _bytes.begin();
|
||||||
|
|
||||||
if (_bytes.size() != ContractABIUtils::encodingSize(_parameters))
|
if (_bytes.size() != ContractABIUtils::encodingSize(_parameters))
|
||||||
parameters = ContractABIUtils::defaultParameters(ceil(_bytes.size() / 32));
|
parameters = ContractABIUtils::defaultParameters((_bytes.size() + 31) / 32);
|
||||||
else
|
else
|
||||||
parameters = _parameters;
|
parameters = _parameters;
|
||||||
|
|
||||||
|
@ -20,6 +20,9 @@
|
|||||||
|
|
||||||
#include <test/libsolidity/util/SoltestErrors.h>
|
#include <test/libsolidity/util/SoltestErrors.h>
|
||||||
|
|
||||||
|
#include <libsolutil/FunctionSelector.h>
|
||||||
|
#include <libsolutil/CommonData.h>
|
||||||
|
|
||||||
#include <liblangutil/Common.h>
|
#include <liblangutil/Common.h>
|
||||||
|
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
@ -314,24 +317,35 @@ solidity::frontend::test::ParameterList ContractABIUtils::defaultParameters(size
|
|||||||
return parameters;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
solidity::frontend::test::ParameterList ContractABIUtils::failureParameters(bytes const _bytes)
|
solidity::frontend::test::ParameterList ContractABIUtils::failureParameters(bytes const& _bytes)
|
||||||
|
{
|
||||||
|
if (_bytes.empty())
|
||||||
|
return {};
|
||||||
|
else if (_bytes.size() < 4)
|
||||||
|
return {Parameter{bytes(), "", ABIType{ABIType::HexString, ABIType::AlignNone, _bytes.size()}, FormatInfo{}}};
|
||||||
|
else
|
||||||
{
|
{
|
||||||
ParameterList parameters;
|
ParameterList parameters;
|
||||||
|
|
||||||
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::HexString, ABIType::AlignNone, 4}, FormatInfo{}});
|
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::HexString, ABIType::AlignNone, 4}, FormatInfo{}});
|
||||||
if (_bytes.size() > 4)
|
|
||||||
|
uint64_t selector = fromBigEndian<uint64_t>(bytes{_bytes.begin(), _bytes.begin() + 4});
|
||||||
|
if (selector == selectorFromSignature32("Panic(uint256)"))
|
||||||
|
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::Hex}, FormatInfo{}});
|
||||||
|
else if (selector == selectorFromSignature32("Error(string)"))
|
||||||
{
|
{
|
||||||
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::Hex}, FormatInfo{}});
|
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::Hex}, FormatInfo{}});
|
||||||
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::UnsignedDec}, FormatInfo{}});
|
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::UnsignedDec}, FormatInfo{}});
|
||||||
}
|
|
||||||
|
|
||||||
/// If _bytes contains at least a 1 byte message (function selector + tail pointer + message length + message)
|
/// If _bytes contains at least a 1 byte message (function selector + tail pointer + message length + message)
|
||||||
/// append an additional string parameter to represent that message.
|
/// append an additional string parameter to represent that message.
|
||||||
if (_bytes.size() > 68)
|
if (_bytes.size() > 68)
|
||||||
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::String}, FormatInfo{}});
|
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::String}, FormatInfo{}});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (size_t i = 4; i < _bytes.size(); i += 32)
|
||||||
|
parameters.push_back(Parameter{bytes(), "", ABIType{ABIType::HexString, ABIType::AlignNone, 32}, FormatInfo{}});
|
||||||
return parameters;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size_t ContractABIUtils::encodingSize(
|
size_t ContractABIUtils::encodingSize(
|
||||||
solidity::frontend::test::ParameterList const& _parameters
|
solidity::frontend::test::ParameterList const& _parameters
|
||||||
|
@ -65,7 +65,7 @@ public:
|
|||||||
/// returned values in case of a failure. Creates an additional parameter
|
/// returned values in case of a failure. Creates an additional parameter
|
||||||
/// for the error message if _bytes is larger than 68 bytes
|
/// for the error message if _bytes is larger than 68 bytes
|
||||||
/// (function_selector + tail_ptr + message_length).
|
/// (function_selector + tail_ptr + message_length).
|
||||||
static ParameterList failureParameters(bytes const _bytes);
|
static ParameterList failureParameters(bytes const& _bytes);
|
||||||
|
|
||||||
/// Returns _count parameters with their type set to ABIType::UnsignedDec
|
/// Returns _count parameters with their type set to ABIType::UnsignedDec
|
||||||
/// and their size set to 32 bytes.
|
/// and their size set to 32 bytes.
|
||||||
|
@ -159,7 +159,7 @@ string TestFunctionCall::format(
|
|||||||
BytesUtils::formatRawBytes(output, abiParams.value(), _linePrefix) :
|
BytesUtils::formatRawBytes(output, abiParams.value(), _linePrefix) :
|
||||||
BytesUtils::formatRawBytes(
|
BytesUtils::formatRawBytes(
|
||||||
output,
|
output,
|
||||||
ContractABIUtils::defaultParameters(ceil(output.size() / 32)),
|
ContractABIUtils::defaultParameters((output.size() + 31) / 32),
|
||||||
_linePrefix
|
_linePrefix
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -248,7 +248,7 @@ string TestFunctionCall::formatBytesParameters(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ParameterList defaultParameters = ContractABIUtils::defaultParameters(ceil(_bytes.size() / 32));
|
ParameterList defaultParameters = ContractABIUtils::defaultParameters((_bytes.size() + 31) / 32);
|
||||||
|
|
||||||
ContractABIUtils::overwriteParameters(_errorReporter, defaultParameters, _parameters);
|
ContractABIUtils::overwriteParameters(_errorReporter, defaultParameters, _parameters);
|
||||||
os << BytesUtils::formatBytesRange(_bytes, defaultParameters, _highlight);
|
os << BytesUtils::formatBytesRange(_bytes, defaultParameters, _highlight);
|
||||||
|
Loading…
Reference in New Issue
Block a user