-
Notifications
You must be signed in to change notification settings - Fork 6.1k
Expand file tree
/
Copy pathfunction_v2.sol
More file actions
28 lines (27 loc) · 1.13 KB
/
function_v2.sol
File metadata and controls
28 lines (27 loc) · 1.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
pragma abicoder v2;
contract C {
struct S { function() external f; }
function ggg(function() external x) external pure returns (uint256 r) {
assembly { r := calldataload(4) }
}
function h(S calldata x) external pure returns (uint256 r) {
x.f; // validation only happens here
assembly { r := calldataload(4) }
}
function dummy() external {}
function ffff(uint256 a) external view returns (uint256, uint256) {
S memory s = S(this.dummy);
assembly { mstore(s, a) }
return (this.ggg(s.f), this.h(s));
}
}
// ----
// ffff(uint256): 0 -> 0, 0
// ggg(function): 0 -> 0
// ffff(uint256): "01234567890123456789abcd" -> "01234567890123456789abcd", "01234567890123456789abcd"
// ggg(function): "01234567890123456789abcd" -> "01234567890123456789abcd"
// h((function)): "01234567890123456789abcd" -> "01234567890123456789abcd"
// h((function)): 0 -> 0
// ffff(uint256): "01234567890123456789abcdX" -> "01234567890123456789abcd", "01234567890123456789abcd"
// ggg(function): "01234567890123456789abcdX" -> FAILURE
// h((function)): "01234567890123456789abcdX" -> FAILURE