智能合约字符串变量为何会发生Integer Overflow与Underflow?
你的合约代码
pragma solidity ^0.4.21; contract Test{ address admin; function Test() public{ admin = msg.sender; } string str = ""; function setStr(string _str) public{ str = _str; } function getStr() public view returns (string){ return str; } }
Oyente分析报告
INFO:root:contract Test.sol:Test:
INFO:symExec: ============ Results ===========
INFO:symExec: EVM Code Coverage: 24.1%
INFO:symExec: Integer Underflow: True
INFO:symExec: Integer Overflow: True
INFO:symExec: Parity Multisig Bug 2: False
INFO:symExec: Callstack Depth Attack Vulnerability: False
INFO:symExec: Transaction-Ordering Dependence (TOD): False
INFO:symExec: Timestamp Dependency: False
INFO:symExec: Re-Entrancy Vulnerability: False
INFO:symExec:Test.sol:16:9: Warning: Integer Underflow.
return strInteger Underflow occurs if:
return str = 1INFO:symExec:Test.sol:11:5: Warning: Integer Overflow.
function setStr(string _str) public{ ^Spanning multiple lines.
Integer Overflow occurs if:
_str = 115792089237316195423570985008687907853269984665640564039457584007913129639932INFO:symExec: ====== Analysis Completed ======
问题解释与解决
原因:Oyente的误报
你的合约中没有任何整数运算逻辑,不存在整数溢出或下溢的风险。出现这个警告是因为Oyente作为一款较旧的符号执行工具,对Solidity的string类型支持不完善:
- Solidity中
string本质是动态字节数组,Oyente在分析字符串的赋值、返回操作时,错误地将动态数组的内部长度字段等数值当成普通整数进行溢出检查; - 报告中给出的触发条件(比如
return str = 1、超大数值赋值给_str)完全不符合string类型的使用逻辑,进一步证明这是误报。
解决方法
- 直接忽略该误报:你的合约逻辑简单明确,没有整数加减乘除等操作,不会触发溢出/下溢问题;
- 更换更可靠的分析工具:使用Slither、Mythril等现代智能合约审计工具,它们对Solidity高级类型的支持更完善,误报率更低;
- 无需修改合约代码:当前合约本身不存在安全问题,不需要针对该误报调整代码逻辑。
内容的提问来源于stack exchange,提问作者MHS

