You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

智能合约字符串变量为何会发生Integer Overflow与Underflow?

关于Oyente误报字符串变量整数溢出/下溢的解释与解决

你的合约代码

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 str

Integer Underflow occurs if:

return str = 1

INFO:symExec:Test.sol:11:5: Warning: Integer Overflow.

function setStr(string _str) public{

^

Spanning multiple lines.

Integer Overflow occurs if:

_str = 115792089237316195423570985008687907853269984665640564039457584007913129639932

INFO:symExec: ====== Analysis Completed ======

问题解释与解决

原因:Oyente的误报

你的合约中没有任何整数运算逻辑,不存在整数溢出或下溢的风险。出现这个警告是因为Oyente作为一款较旧的符号执行工具,对Solidity的string类型支持不完善:

  • Solidity中string本质是动态字节数组,Oyente在分析字符串的赋值、返回操作时,错误地将动态数组的内部长度字段等数值当成普通整数进行溢出检查;
  • 报告中给出的触发条件(比如return str = 1、超大数值赋值给_str)完全不符合string类型的使用逻辑,进一步证明这是误报。

解决方法

  1. 直接忽略该误报:你的合约逻辑简单明确,没有整数加减乘除等操作,不会触发溢出/下溢问题;
  2. 更换更可靠的分析工具:使用Slither、Mythril等现代智能合约审计工具,它们对Solidity高级类型的支持更完善,误报率更低;
  3. 无需修改合约代码:当前合约本身不存在安全问题,不需要针对该误报调整代码逻辑。

内容的提问来源于stack exchange,提问作者MHS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:15:48