mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #2265 from roadriverrail/inline_asm_unused_warning
Analyze InlineAssembly for variable use
This commit is contained in:
		
						commit
						74d2e7311a
					
				| @ -1,6 +1,9 @@ | ||||
| ### 0.4.12 (unreleased) | ||||
|  * AST: export all attributes to Json format | ||||
| 
 | ||||
| Bugfixes: | ||||
|  * Unused variable warnings no longer issued for variables used inside inline assembly | ||||
| 
 | ||||
| ### 0.4.11 (2017-05-03) | ||||
| 
 | ||||
| Features: | ||||
|  | ||||
| @ -21,14 +21,16 @@ | ||||
|  */ | ||||
| 
 | ||||
| #include <libsolidity/analysis/StaticAnalyzer.h> | ||||
| #include <memory> | ||||
| #include <libsolidity/ast/AST.h> | ||||
| #include <libsolidity/inlineasm/AsmAnalysis.h> | ||||
| #include <libsolidity/inlineasm/AsmAnalysisInfo.h> | ||||
| #include <libsolidity/inlineasm/AsmData.h> | ||||
| #include <memory> | ||||
| 
 | ||||
| using namespace std; | ||||
| using namespace dev; | ||||
| using namespace dev::solidity; | ||||
| 
 | ||||
| 
 | ||||
| bool StaticAnalyzer::analyze(SourceUnit const& _sourceUnit) | ||||
| { | ||||
| 	_sourceUnit.accept(*this); | ||||
| @ -128,3 +130,22 @@ void StaticAnalyzer::warning(SourceLocation const& _location, string const& _des | ||||
| 
 | ||||
| 	m_errors.push_back(err); | ||||
| } | ||||
| 
 | ||||
| bool StaticAnalyzer::visit(InlineAssembly const& _inlineAssembly) | ||||
| { | ||||
| 	if (!m_currentFunction) | ||||
| 		return true; | ||||
| 
 | ||||
| 	for (auto const& ref: _inlineAssembly.annotation().externalReferences) | ||||
| 	{ | ||||
| 		if (auto var = dynamic_cast<VariableDeclaration const*>(ref.second.declaration)) | ||||
| 		{ | ||||
| 			solAssert(!var->name().empty(), ""); | ||||
| 			if (var->isLocalVariable()) | ||||
| 				m_localVarUseCount[var] += 1; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -65,6 +65,7 @@ private: | ||||
| 	virtual bool visit(Identifier const& _identifier) override; | ||||
| 	virtual bool visit(Return const& _return) override; | ||||
| 	virtual bool visit(MemberAccess const& _memberAccess) override; | ||||
| 	virtual bool visit(InlineAssembly const& _inlineAssembly) override; | ||||
| 
 | ||||
| 	ErrorList& m_errors; | ||||
| 
 | ||||
|  | ||||
| @ -5718,6 +5718,20 @@ BOOST_AUTO_TEST_CASE(no_unused_dec_after_use) | ||||
| 	CHECK_SUCCESS_NO_WARNINGS(text); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(no_unused_inline_asm) | ||||
| { | ||||
| 	char const* text = R"( | ||||
| 		contract C { | ||||
| 			function f() { | ||||
| 				uint a; | ||||
| 				assembly { | ||||
| 					a := 1 | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	CHECK_SUCCESS_NO_WARNINGS(text); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user