我想了解的阵列的大小通过查看字节码,如果该信息是在编译时已知的,当然被分配。

背景:我想要写一个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

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top