文章前言
当已定义操作的意图是将一个数字与变量求和(+=),但意外地使用了错误的操作(=+)就会出现笔误,而这恰好是有效的操作符,这不是计算总和,而是再次初始化变量,一元+运算符在新的Solidity编译器版本中已弃用。
漏洞示例
示例合约如下所示:
pragma solidity ^0.4.25;
contract TypoOneCommand {
uint numberOne = 2;
function alwaysOne() public returns(uint a){
return numberOne =+ 1;
}
}
编译并部署合约之后调用alwaysOne来进行简易测试,可以看到此时的numberOne被初始化成了1:
防御措施
1、所有的数值运算操作全部采用SafeMath来实现
2、使用最新的编译器,最新版本编译器会自动检测是否存在类似的安全问题
参考链接
https://github.com/ethereum/solidity/issues/1760
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol
凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字凑数字
原创文章,作者:七芒星实验室,如若转载,请注明出处:https://www.sudun.com/ask/34121.html