mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Integer min and max values placed under SymbolicIntVar instead of SMTChecker
This commit is contained in:
parent
f41591b3dd
commit
3b2851ee41
@ -24,6 +24,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <libsolidity/formal/SSAVariable.h>
|
#include <libsolidity/formal/SSAVariable.h>
|
||||||
|
#include <libsolidity/formal/SymbolicIntVariable.h>
|
||||||
#include <libsolidity/formal/VariableUsage.h>
|
#include <libsolidity/formal/VariableUsage.h>
|
||||||
|
|
||||||
#include <libsolidity/interface/ErrorReporter.h>
|
#include <libsolidity/interface/ErrorReporter.h>
|
||||||
@ -244,14 +245,14 @@ void SMTChecker::endVisit(TupleExpression const& _tuple)
|
|||||||
void SMTChecker::checkUnderOverflow(smt::Expression _value, IntegerType const& _type, SourceLocation const& _location)
|
void SMTChecker::checkUnderOverflow(smt::Expression _value, IntegerType const& _type, SourceLocation const& _location)
|
||||||
{
|
{
|
||||||
checkCondition(
|
checkCondition(
|
||||||
_value < minValue(_type),
|
_value < SymbolicIntVariable::minValue(_type),
|
||||||
_location,
|
_location,
|
||||||
"Underflow (resulting value less than " + formatNumber(_type.minValue()) + ")",
|
"Underflow (resulting value less than " + formatNumber(_type.minValue()) + ")",
|
||||||
"value",
|
"value",
|
||||||
&_value
|
&_value
|
||||||
);
|
);
|
||||||
checkCondition(
|
checkCondition(
|
||||||
_value > maxValue(_type),
|
_value > SymbolicIntVariable::maxValue(_type),
|
||||||
_location,
|
_location,
|
||||||
"Overflow (resulting value larger than " + formatNumber(_type.maxValue()) + ")",
|
"Overflow (resulting value larger than " + formatNumber(_type.maxValue()) + ")",
|
||||||
"value",
|
"value",
|
||||||
@ -828,15 +829,6 @@ void SMTChecker::defineExpr(Expression const& _e, smt::Expression _value)
|
|||||||
m_interface->addAssertion(expr(_e) == _value);
|
m_interface->addAssertion(expr(_e) == _value);
|
||||||
}
|
}
|
||||||
|
|
||||||
smt::Expression SMTChecker::minValue(IntegerType const& _t)
|
|
||||||
{
|
|
||||||
return smt::Expression(_t.minValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
smt::Expression SMTChecker::maxValue(IntegerType const& _t)
|
|
||||||
{
|
|
||||||
return smt::Expression(_t.maxValue());
|
|
||||||
}
|
|
||||||
void SMTChecker::popPathCondition()
|
void SMTChecker::popPathCondition()
|
||||||
{
|
{
|
||||||
solAssert(m_pathConditions.size() > 0, "Cannot pop path condition, empty.");
|
solAssert(m_pathConditions.size() > 0, "Cannot pop path condition, empty.");
|
||||||
|
@ -140,9 +140,6 @@ private:
|
|||||||
/// Resets the variable to an unknown value (in its range).
|
/// Resets the variable to an unknown value (in its range).
|
||||||
void setUnknownValue(Declaration const& decl);
|
void setUnknownValue(Declaration const& decl);
|
||||||
|
|
||||||
static smt::Expression minValue(IntegerType const& _t);
|
|
||||||
static smt::Expression maxValue(IntegerType const& _t);
|
|
||||||
|
|
||||||
/// Returns the expression corresponding to the AST node. Throws if the expression does not exist.
|
/// Returns the expression corresponding to the AST node. Throws if the expression does not exist.
|
||||||
smt::Expression expr(Expression const& _e);
|
smt::Expression expr(Expression const& _e);
|
||||||
/// Creates the expression (value can be arbitrary)
|
/// Creates the expression (value can be arbitrary)
|
||||||
|
@ -43,12 +43,12 @@ void SymbolicIntVariable::setUnknownValue(int _seq)
|
|||||||
m_interface.addAssertion(valueAtSequence(_seq) <= maxValue(intType));
|
m_interface.addAssertion(valueAtSequence(_seq) <= maxValue(intType));
|
||||||
}
|
}
|
||||||
|
|
||||||
smt::Expression SymbolicIntVariable::minValue(IntegerType const& _t) const
|
smt::Expression SymbolicIntVariable::minValue(IntegerType const& _t)
|
||||||
{
|
{
|
||||||
return smt::Expression(_t.minValue());
|
return smt::Expression(_t.minValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
smt::Expression SymbolicIntVariable::maxValue(IntegerType const& _t) const
|
smt::Expression SymbolicIntVariable::maxValue(IntegerType const& _t)
|
||||||
{
|
{
|
||||||
return smt::Expression(_t.maxValue());
|
return smt::Expression(_t.maxValue());
|
||||||
}
|
}
|
||||||
|
@ -39,12 +39,13 @@ public:
|
|||||||
SymbolicIntVariable& operator=(SymbolicIntVariable const&) = default;
|
SymbolicIntVariable& operator=(SymbolicIntVariable const&) = default;
|
||||||
SymbolicIntVariable& operator=(SymbolicIntVariable&&) = default;
|
SymbolicIntVariable& operator=(SymbolicIntVariable&&) = default;
|
||||||
|
|
||||||
|
/// Sets the var to 0.
|
||||||
void setZeroValue(int _seq);
|
void setZeroValue(int _seq);
|
||||||
|
/// Sets the valid interval for the var.
|
||||||
void setUnknownValue(int _seq);
|
void setUnknownValue(int _seq);
|
||||||
|
|
||||||
private:
|
static smt::Expression minValue(IntegerType const& _t);
|
||||||
smt::Expression minValue(IntegerType const& _t) const;
|
static smt::Expression maxValue(IntegerType const& _t);
|
||||||
smt::Expression maxValue(IntegerType const& _t) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user