栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Asm报数组异常-如ArrayIndexOutOfBoundsException

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Asm报数组异常-如ArrayIndexOutOfBoundsException

java.lang.NegativeArraySizeException
java.lang.NegativeArraySizeException
	at org.springframework.asm.frame.merge(frame.java:1222)
	at org.springframework.asm.MethodWriter.computeAllframes(MethodWriter.java:1610)
	at org.springframework.asm.MethodWriter.visitMaxs(MethodWriter.java:1546)
	at com.nailsoul.spring.core.asm.proxy.asm.util.CodeUtils.endMethod(CodeUtils.java:273)

如发生在 if场景 IFGT之前没有往栈内压入int类型数据

CodeUtils.condition(mv,IFGT,()->{
	mv.visitVarInsn(ALOAD,2);
	mv.visitInsn(POP);
});

修复代码

mv.visitIntInsn(BIPUSH,3);
CodeUtils.condition(mv,IFGT,()->{
	mv.visitVarInsn(ALOAD,2);
	mv.visitInsn(POP);
});
ArrayIndexOutOfBoundsException

数字不一定是0

java.lang.ArrayIndexOutOfBoundsException: 0

	at org.springframework.asm.frame.merge(frame.java:1268)
	at org.springframework.asm.frame.merge(frame.java:1244)
	at org.springframework.asm.MethodWriter.computeAllframes(MethodWriter.java:1610)
	at org.springframework.asm.MethodWriter.visitMaxs(MethodWriter.java:1546)
	at com.nailsoul.spring.core.asm.proxy.asm.util.CodeUtils.endMethod(CodeUtils.java:273)

通过asm动态添加方法时 时不时报数组越界错误 经过分析
分为生成的代码运行是逻辑异常 和 语法异常

  • 逻辑异常
    空数组访问下标为0的元素肯定报错
    根据异常打印的调用链可以区分
  • 语法异常
    把变量压入栈内 没处理到致的 如以下获取数组指定下标元素 通常visitMaxs引起的
    mv.visitVarInsn(ALOAD,2);
    mv.visitVarInsn(ILOAD,4);
    mv.visitInsn(AALOAD);
    

对应的代码

var2[var4];

后续没有处理 肯定得标红

修复

mv.visitVarInsn(ALOAD,2);
mv.visitVarInsn(ILOAD,4);
mv.visitInsn(AALOAD);
// 只要把该元素消费调就行 如pop
mv.visitVarInsn(ASTORE,5);

有时相同代码明明在这A处不报错 移到B处就报错了 如
没有被if等快包裹时 没问题

mv.visitLdcInsn(11);
mv.visitVarInsn(ILOAD,4);

被if包裹 就报错了

CodeUtils.condition(mv,IFGT,()->{
	mv.visitLdcInsn(11);
	mv.visitVarInsn(ILOAD,4);
});

修复代码

CodeUtils.condition(mv,IFGT,()->{
	mv.visitLdcInsn(11);
	mv.visitVarInsn(ILOAD,4);
	mv.visitInsn(POP2);
});
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584647.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号