mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #14269 from blishko/smtchecker-fix-analysis-external-calls
[SMTChecker] Remember verification targets from trusted external calls
This commit is contained in:
		
						commit
						ceab4dfee5
					
				| @ -15,7 +15,7 @@ Compiler Features: | |||||||
| Bugfixes: | Bugfixes: | ||||||
|  * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. |  * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. | ||||||
|  * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. |  * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. | ||||||
| 
 |  * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. | ||||||
| 
 | 
 | ||||||
| AST Changes: | AST Changes: | ||||||
|  * AST: Add the ``experimentalSolidity`` field to the ``SourceUnit`` nodes, which indicate whether the experimental parsing mode has been enabled via ``pragma experimental solidity``. |  * AST: Add the ``experimentalSolidity`` field to the ``SourceUnit`` nodes, which indicate whether the experimental parsing mode has been enabled via ``pragma experimental solidity``. | ||||||
|  | |||||||
| @ -1000,6 +1000,12 @@ void CHC::externalFunctionCallToTrustedCode(FunctionCall const& _funCall) | |||||||
| 	if (!function) | 	if (!function) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
|  | 	// Remember the external call in the call graph to properly detect verification targets for the current function
 | ||||||
|  | 	if (m_currentFunction && !m_currentFunction->isConstructor()) | ||||||
|  | 		m_callGraph[m_currentFunction].insert(function); | ||||||
|  | 	else | ||||||
|  | 		m_callGraph[m_currentContract].insert(function); | ||||||
|  | 
 | ||||||
| 	// External call creates a new transaction.
 | 	// External call creates a new transaction.
 | ||||||
| 	auto originalTx = state().tx(); | 	auto originalTx = state().tx(); | ||||||
| 	Expression const* value = valueOption(callOptions); | 	Expression const* value = valueOption(callOptions); | ||||||
|  | |||||||
| @ -21,11 +21,8 @@ contract C { | |||||||
| // SMTIgnoreOS: macos | // SMTIgnoreOS: macos | ||||||
| // ---- | // ---- | ||||||
| // Warning 4984: (47-50): CHC: Overflow (resulting value larger than 2**256 - 1) might happen here. | // Warning 4984: (47-50): CHC: Overflow (resulting value larger than 2**256 - 1) might happen here. | ||||||
| // Warning 6328: (167-185): CHC: Assertion violation might happen here. |  | ||||||
| // Warning 6328: (215-233): CHC: Assertion violation might happen here. | // Warning 6328: (215-233): CHC: Assertion violation might happen here. | ||||||
| // Warning 6328: (267-285): CHC: Assertion violation might happen here. |  | ||||||
| // Warning 6328: (304-322): CHC: Assertion violation happens here. | // Warning 6328: (304-322): CHC: Assertion violation happens here. | ||||||
|  | // Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. | ||||||
| // Warning 2661: (47-50): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. | // Warning 2661: (47-50): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. | ||||||
| // Warning 4661: (167-185): BMC: Assertion violation happens here. |  | ||||||
| // Warning 4661: (215-233): BMC: Assertion violation happens here. | // Warning 4661: (215-233): BMC: Assertion violation happens here. | ||||||
| // Warning 4661: (267-285): BMC: Assertion violation happens here. |  | ||||||
|  | |||||||
| @ -0,0 +1,23 @@ | |||||||
|  | contract C { | ||||||
|  | 
 | ||||||
|  | 	uint v; | ||||||
|  | 	bool guard = true; | ||||||
|  | 
 | ||||||
|  | 	function dec() public returns (uint) { | ||||||
|  | 		if (guard) return 0; | ||||||
|  | 		--v; | ||||||
|  | 		return v; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	function f() public returns (uint) { | ||||||
|  | 		guard = false; | ||||||
|  | 		uint ret = this.dec(); | ||||||
|  | 		guard = true; | ||||||
|  | 		return ret; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // SMTEngine: chc | ||||||
|  | // SMTTargets: underflow | ||||||
|  | // ---- | ||||||
|  | // Warning 3944: (109-112): CHC: Underflow (resulting value less than 0) happens here. | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user