`
yesjavame
  • 浏览: 659595 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

这样的错误竟然能得到正确的值,这个bug藏的够深的。

阅读更多

为了统计方法执行时候,我用ASM在方法开始的时候插入一个变量startLocal记录开始执行的时间,然后在结束的时间用当前时间去差这个开始时间,为了调试,我同时又插入了一个endLocal

注意这段有bug的代码竟然可以正确地执行了。但是当我去掉调示后,改成这样:

却得不到正确的结果了。于是反复查看地,终于发现了

this.startLocal = this.newLocal(Type.getType(Long.class));

应该是:

this.startLocal = this.newLocal(Type.LONG_TYPE);

如果开始分配的栈不对,两个object的栈相当于一个long的栈,但在LSUB的时候为什么是正确的?

两个Long对象进行lsub,虽然java源码在编译的时候可以自动插入转换指令,但在上面的字节码指令中

仍然可以正确LSUB,虽然栈中的值是正确的,但却越过了类型检查。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics