Merge pull request #6604 from ethereum/library-self-delegatecall

Error on library calling itself externally
This commit is contained in:
chriseth 2019-05-02 17:25:25 +02:00 committed by GitHub
commit e9f41d1148
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 0 deletions

View File

@ -1,6 +1,7 @@
### 0.5.9 (unreleased)
Language Features:
* Static Analyzer: Disallow libraries calling themselves externally.
Compiler Features:

View File

@ -309,6 +309,19 @@ bool StaticAnalyzer::visit(FunctionCall const& _functionCall)
"Arithmetic modulo zero."
);
}
if (
m_currentContract->isLibrary() &&
functionType->kind() == FunctionType::Kind::DelegateCall &&
functionType->declaration().scope() == m_currentContract
)
m_errorReporter.typeError(
_functionCall.location(),
SecondarySourceLocation().append(
"The function declaration is here:",
functionType->declaration().scope()->location()
),
"Libraries cannot call their own functions externally."
);
}
return true;
}

View File

@ -0,0 +1,13 @@
library L1 {
using L1 for *;
function f() public pure returns (uint r) { return r.g(); }
function g(uint) public pure returns (uint) { return 2; }
}
library L2 {
using L1 for *;
function f() public pure returns (uint r) { return r.g(); }
function g(uint) public pure returns (uint) { return 2; }
}
// ----
// TypeError: (88-93): Libraries cannot call their own functions externally.