質問

私はその情報がコンパイル時にわかっている場合はもちろん、バイトコードを見ることで、割り当てられている配列のサイズを知るしたいと思います。

背景:私は(コンパイル済みバイトコードを見て)FindBugsの検出器を作成し、配列の割り当ての特定の出現箇所を報告したいです。偽の私は「小」の配列で興味がないの陽性が、その大きさだけのものをフィルタリングするためには、コンパイル時に利用できないか、設定可能なしきい値よりも大きいこと。

FindBugsのソースコードは、あまりにも頻繁に文書化されていないとして、

、私が開始する方法についていくつかのポインタを探しています - 多分すでに私が見ることができるという似た何かをやってdectectorあります。

役に立ちましたか?

解決

これは一種のトリッキー得ることができます。私の知識は不完全ですが、あなたは(NEWARRAY、ANEWARRAYとMULTIANEWARRAY)のために外を見るために命令の少なくとも3種類があります。前の命令を見てみると(またはMULTIANEWARRAYの場合は、のN の前の命令が)、それはあっても、一定の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