mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	[SMTChecker] Introduce SymbolicFunctionVariable
This commit is contained in:
		
							parent
							
								
									6240d9e72a
								
							
						
					
					
						commit
						de46bb2c42
					
				| @ -99,3 +99,31 @@ SymbolicFixedBytesVariable::SymbolicFixedBytesVariable( | |||||||
| 	SymbolicIntVariable(make_shared<IntegerType>(_numBytes * 8), _uniqueName, _interface) | 	SymbolicIntVariable(make_shared<IntegerType>(_numBytes * 8), _uniqueName, _interface) | ||||||
| { | { | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | SymbolicFunctionVariable::SymbolicFunctionVariable( | ||||||
|  | 	TypePointer _type, | ||||||
|  | 	string const& _uniqueName, | ||||||
|  | 	smt::SolverInterface&_interface | ||||||
|  | ): | ||||||
|  | 	SymbolicVariable(move(_type), _uniqueName, _interface), | ||||||
|  | 	m_declaration(m_interface.newVariable(currentName(), smtSort(*m_type))) | ||||||
|  | { | ||||||
|  | 	solAssert(m_type->category() == Type::Category::Function, ""); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SymbolicFunctionVariable::resetDeclaration() | ||||||
|  | { | ||||||
|  | 	m_declaration = m_interface.newVariable(currentName(), smtSort(*m_type)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | smt::Expression SymbolicFunctionVariable::increaseIndex() | ||||||
|  | { | ||||||
|  | 	++(*m_ssa); | ||||||
|  | 	resetDeclaration(); | ||||||
|  | 	return currentValue(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | smt::Expression SymbolicFunctionVariable::operator()(vector<smt::Expression> _arguments) const | ||||||
|  | { | ||||||
|  | 	return m_declaration(_arguments); | ||||||
|  | } | ||||||
|  | |||||||
| @ -49,7 +49,11 @@ public: | |||||||
| 	smt::Expression currentValue() const; | 	smt::Expression currentValue() const; | ||||||
| 	std::string currentName() const; | 	std::string currentName() const; | ||||||
| 	virtual smt::Expression valueAtIndex(int _index) const; | 	virtual smt::Expression valueAtIndex(int _index) const; | ||||||
| 	smt::Expression increaseIndex(); | 	virtual smt::Expression increaseIndex(); | ||||||
|  | 	virtual smt::Expression operator()(std::vector<smt::Expression> /*_arguments*/) const | ||||||
|  | 	{ | ||||||
|  | 		solAssert(false, "Function application to non-function."); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	unsigned index() const { return m_ssa->index(); } | 	unsigned index() const { return m_ssa->index(); } | ||||||
| 	unsigned& index() { return m_ssa->index(); } | 	unsigned& index() { return m_ssa->index(); } | ||||||
| @ -116,5 +120,28 @@ public: | |||||||
| 	); | 	); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Specialization of SymbolicVariable for FunctionType | ||||||
|  |  */ | ||||||
|  | class SymbolicFunctionVariable: public SymbolicVariable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	SymbolicFunctionVariable( | ||||||
|  | 		TypePointer _type, | ||||||
|  | 		std::string const& _uniqueName, | ||||||
|  | 		smt::SolverInterface& _interface | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	smt::Expression increaseIndex(); | ||||||
|  | 	smt::Expression operator()(std::vector<smt::Expression> _arguments) const; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	/// Creates a new function declaration.
 | ||||||
|  | 	void resetDeclaration(); | ||||||
|  | 
 | ||||||
|  | 	/// Stores the current function declaration.
 | ||||||
|  | 	smt::Expression m_declaration; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| } | } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user