diff options
author | chriseth <chris@ethereum.org> | 2017-09-28 21:24:24 +0800 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2017-11-22 10:35:34 +0800 |
commit | b37377641dd1cac7d1b5d5307ea6f7517c0f321f (patch) | |
tree | 87f0fa99f5eec5d1f41b5c0ea7f5e3f3ebf7d391 /libsolidity/formal/SMTChecker.h | |
parent | f62caf587e9df37c67518d199065ab50bcbb320c (diff) | |
download | dexon-solidity-b37377641dd1cac7d1b5d5307ea6f7517c0f321f.tar dexon-solidity-b37377641dd1cac7d1b5d5307ea6f7517c0f321f.tar.gz dexon-solidity-b37377641dd1cac7d1b5d5307ea6f7517c0f321f.tar.bz2 dexon-solidity-b37377641dd1cac7d1b5d5307ea6f7517c0f321f.tar.lz dexon-solidity-b37377641dd1cac7d1b5d5307ea6f7517c0f321f.tar.xz dexon-solidity-b37377641dd1cac7d1b5d5307ea6f7517c0f321f.tar.zst dexon-solidity-b37377641dd1cac7d1b5d5307ea6f7517c0f321f.zip |
Track usage of variables.
Diffstat (limited to 'libsolidity/formal/SMTChecker.h')
-rw-r--r-- | libsolidity/formal/SMTChecker.h | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/libsolidity/formal/SMTChecker.h b/libsolidity/formal/SMTChecker.h index 6575dc1b..b2726a42 100644 --- a/libsolidity/formal/SMTChecker.h +++ b/libsolidity/formal/SMTChecker.h @@ -17,8 +17,11 @@ #pragma once -#include <libsolidity/ast/ASTVisitor.h> + #include <libsolidity/formal/SolverInterface.h> + +#include <libsolidity/ast/ASTVisitor.h> + #include <libsolidity/interface/ReadFile.h> #include <map> @@ -29,6 +32,7 @@ namespace dev namespace solidity { +class VariableUsage; class ErrorReporter; class SMTChecker: private ASTConstVisitor @@ -61,11 +65,12 @@ private: void compareOperation(BinaryOperation const& _op); void booleanOperation(BinaryOperation const& _op); + void assignment(Declaration const& _variable, Expression const& _value); + // Visits the branch given by the statement, pushes and pops the SMT checker. - // @returns the set of touched declarations // @param _condition if present, asserts that this condition is true within the branch. - std::set<Declaration const*> visitBranch(Statement const& _statement, smt::Expression const* _condition = nullptr); - std::set<Declaration const*> visitBranch(Statement const& _statement, smt::Expression _condition); + void visitBranch(Statement const& _statement, smt::Expression const* _condition = nullptr); + void visitBranch(Statement const& _statement, smt::Expression _condition); void checkCondition( smt::Expression _condition, @@ -75,8 +80,9 @@ private: smt::Expression* _additionalValue = nullptr ); - void resetVariables(std::set<Declaration const*> _variables); - void createVariable(VariableDeclaration const& _varDecl, bool _setToZero); + void initializeLocalVariables(FunctionDefinition const& _function); + void resetVariables(std::vector<Declaration const*> _variables); + void createVariable(VariableDeclaration const& _varDecl); static std::string uniqueSymbol(Declaration const& _decl); static std::string uniqueSymbol(Expression const& _expr); @@ -94,8 +100,10 @@ private: /// sequence number to this value and returns the expression. smt::Expression newValue(Declaration const& _decl); - /// Sets the value of the declaration either to zero or to its intrinsic range. - void setValue(Declaration const& _decl, bool _setToZero); + /// Sets the value of the declaration to zero. + void setZeroValue(Declaration const& _decl); + /// Resets the variable to an unknown value (in its range). + void setUnknownValue(Declaration const& decl); static smt::Expression minValue(IntegerType const& _t); static smt::Expression maxValue(IntegerType const& _t); @@ -110,6 +118,7 @@ private: smt::Expression var(Declaration const& _decl); std::shared_ptr<smt::SolverInterface> m_interface; + std::shared_ptr<VariableUsage> m_variableUsage; bool m_conditionalExecutionHappened = false; std::map<Declaration const*, int> m_currentSequenceCounter; std::map<Declaration const*, int> m_nextFreeSequenceCounter; |