mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #10826 from ethereum/issue-10821
Fix missing error when accessing unintialized variables.
This commit is contained in:
		
						commit
						9fc3d88617
					
				| @ -32,6 +32,7 @@ Bugfixes: | |||||||
|  * SMTChecker: Fix internal error on pushing string literal to ``bytes`` array. |  * SMTChecker: Fix internal error on pushing string literal to ``bytes`` array. | ||||||
|  * Type Checker: Fix internal error caused by constant structs containing mappings. |  * Type Checker: Fix internal error caused by constant structs containing mappings. | ||||||
|  * Type System: Disallow implicit conversion from ``uintN`` to ``intM`` when ``M > N``, and by extension, explicit conversion between the same types is also disallowed. |  * Type System: Disallow implicit conversion from ``uintN`` to ``intM`` when ``M > N``, and by extension, explicit conversion between the same types is also disallowed. | ||||||
|  |  * Control Flow Graph: Fix missing error caused by read from/write to uninitialized variables. | ||||||
| 
 | 
 | ||||||
| ### 0.8.0 (2020-12-16) | ### 0.8.0 (2020-12-16) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -110,7 +110,10 @@ void ControlFlowAnalyzer::checkUninitializedAccess(CFGNode const* _entry, CFGNod | |||||||
| 
 | 
 | ||||||
| 		// Propagate changes to all exits and queue them for traversal, if needed.
 | 		// Propagate changes to all exits and queue them for traversal, if needed.
 | ||||||
| 		for (auto const& exit: currentNode->exits) | 		for (auto const& exit: currentNode->exits) | ||||||
| 			if (nodeInfos[exit].propagateFrom(nodeInfo)) | 			if ( | ||||||
|  | 				auto exists = valueOrNullptr(nodeInfos, exit); | ||||||
|  | 				nodeInfos[exit].propagateFrom(nodeInfo) || !exists | ||||||
|  | 			) | ||||||
| 				nodesToTraverse.insert(exit); | 				nodesToTraverse.insert(exit); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -0,0 +1,9 @@ | |||||||
|  | contract Test { | ||||||
|  | 	function testFunc() external { | ||||||
|  | 		for (;;) {} | ||||||
|  | 		bytes storage b; | ||||||
|  | 		b[0] = 0x42; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 3464: (83-84): This variable is of storage pointer type and can be accessed without prior assignment, which would lead to undefined behaviour. | ||||||
| @ -0,0 +1,13 @@ | |||||||
|  | contract Test { | ||||||
|  | 
 | ||||||
|  |   struct Sample { bool flag; } | ||||||
|  |   Sample public s; | ||||||
|  | 
 | ||||||
|  |    function testFunc() external { | ||||||
|  |         if(true){} | ||||||
|  |         Sample storage t; | ||||||
|  |         t.flag=true; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 3464: (155-156): This variable is of storage pointer type and can be accessed without prior assignment, which would lead to undefined behaviour. | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | contract Test { | ||||||
|  | 
 | ||||||
|  |   struct Sample { bool flag; } | ||||||
|  |   Sample public s; | ||||||
|  | 
 | ||||||
|  |   modifier checkAddr(address _a){ | ||||||
|  |       require(_a!=address(0)); | ||||||
|  |       _; | ||||||
|  |   } | ||||||
|  |   function testFunc(address _a) external checkAddr(_a) { | ||||||
|  |         Sample storage t; | ||||||
|  |         t.flag=true; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 3464: (237-238): This variable is of storage pointer type and can be accessed without prior assignment, which would lead to undefined behaviour. | ||||||
| @ -0,0 +1,9 @@ | |||||||
|  | contract Test { | ||||||
|  | 	function testFunc() external { | ||||||
|  | 		require(true); | ||||||
|  | 		bytes storage b; | ||||||
|  | 		b[0] = 0x42; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 3464: (86-87): This variable is of storage pointer type and can be accessed without prior assignment, which would lead to undefined behaviour. | ||||||
| @ -0,0 +1,9 @@ | |||||||
|  | contract Test { | ||||||
|  | 	function testFunc() external { | ||||||
|  | 		while (true) {} | ||||||
|  | 		bytes storage b; | ||||||
|  | 		b[0] = 0x42; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 3464: (87-88): This variable is of storage pointer type and can be accessed without prior assignment, which would lead to undefined behaviour. | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user