如何检测数组的大小在Java字节码(FindBugs的)
-
13-09-2019 - |
题
我想了解的阵列的大小通过查看字节码,如果该信息是在编译时已知的,当然被分配。
背景:我想要写一个FindBugs的检测器(其着眼于编译的字节代码),并报告阵列分配的一定出现次数。为了过滤掉误报我不感兴趣的“小”数组,但是唯一的,其大小,不提供在编译时或大于可配置的阈值。
随着FindBugs的源代码是不是太沉重记录,我要寻找关于如何开始一些指针 - 也许已经有一个dectector做类似的东西,我可以看看
。解决方案
这可以得到一定的技巧。我的知识是不完整的,但你必须至少有三个种类的指令看出来的(NEWARRAY,ANEWARRAY和MULTIANEWARRAY)。看看前面的指令(或MULTIANEWARRAY的情况下,的名词的前面的指令)获取的大小,这即使是一个常数可能装有BIPUSH,SIPUSH或LDC(别的东西吗?)根据上规模。如您所知,如果类是计算的结果,可能会跟踪指令回无限期。
如果我没有记错,FindBugs的使用BCEL内部,但我从来没有在那里挖周围,看看他们是究竟如何聪明。如果其中一个球队都有相应的邮件列表,他们可能会发现一个更好的地方要问 - 他们很可能至少知道,如果某人以前这条路一直走下去。
其他提示
好吧,如果它们是基于恒定分配的,你可以检查刚分配前推一个常数。例如:
class ArraySize {
private static final int smallsize = 10;
private static final int largesize = 1000;
public static void main(String[] args) {
int[] small = new int[smallsize];
int[] big = new int[largesize];
}
}
给出字节码:
Compiled from "ArraySize.java"
class ArraySize extends java.lang.Object{
ArraySize();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 10
2: newarray int
4: astore_1
5: sipush 1000
8: newarray int
10: astore_2
11: return
}
不隶属于 StackOverflow