首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当Solidity编译为无效的跳转目标时的所有情况

问当Solidity编译为无效的跳转目标时的所有情况
EN

Ethereum用户
提问于 2016-06-07 06:24:09
回答 2查看 2.8K关注 0票数 7

Solidity生成EVM字节码,在以下情况下导致无效的跳转目标:

  • 使用throw
  • ...
  • ...

能否用例子来完成上面的清单?

为了解释第一项,即Solidity源代码中的throw,将其编译到EVM字节码中,从而导致无效的跳转目标。(当然,它假定throw没有死代码,可以进行优化。)列表中的所有其他场景是什么?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2016-06-20 09:14:45

只为(显式或隐式)异常生成到无效跳转目的地的跳转。一个显式的例外是当您使用关键字throw时。隐式异常发生在运行时错误:

  • 数组访问超出界限
  • 子调用失败(由于EVM报告的任何原因,包括子调用中无效的跳转)
  • 发送到库回退函数的醚
票数 9
EN

Ethereum用户

发布于 2016-06-07 08:09:38

阵列越界

代码语言:javascript
复制
contract InvalidJump {
    uint[5] data;

    function invalidJump1() {
       uint i = 6000;
       data[i] = 1;
    }
}

来自debug.traceTransaction(...)的信息是:

代码语言:javascript
复制
error: "invalid jump destination (PUSH1) 2"

(稍微相关的)堆栈限制达到1024

不是问题中的问题,而是有趣的问题。

代码语言:javascript
复制
contract InvalidJump2 {
    function invalidJump2(uint number) {
        invalidJump2(number - 1);
    }
}

使用以下事务调用:

代码语言:javascript
复制
invalidJump.invalidJump2(1, eth.accounts[0], {
  from:web3.eth.accounts[0], 
  data: invalidJumpCompiled.InvalidJump.code,
  gas: 1000000
});

以及错误消息:

代码语言:javascript
复制
I0607 18:04:49.978794 core/state_transition.go:258] VM call err: stack limit reached 1024 (1024)

另外,debug.traceTransaction(...)会疯狂地发送geth console屏幕。

票数 6
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/5743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档