문제

물론 컴파일 시간에 해당 정보가 알려진 경우 바이트 코드를 보면 배열의 크기에 대해 알고 싶습니다.

배경 : FindBugs 탐지기 (컴파일 된 바이트 코드를 보면)를 작성하고 배열 할당의 특정 발생을보고하고 싶습니다. 잘못된 양성을 걸러 내기 위해 나는 "작은"배열에 관심이 없지만 컴파일 시간에 크기가 없거나 구성 가능한 임계 값보다 크기가 큰 배열에 관심이 없습니다.

FindBugs sourcecode가 너무 많이 문서화되지 않았기 때문에 시작하는 방법에 대한 몇 가지 포인터를 찾고 있습니다. 아마도 내가 볼 수있는 것과 비슷한 일을하는 지질이있을 것입니다.

도움이 되었습니까?

해결책

이것은 까다로울 수 있습니다. 내 지식은 불완전하지만, 최소한 세 종류의 지침을 찾을 수 있습니다 (NewArray, anewarray 및 multianewarray). 이전 지침을보고 (또는 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