Pergunta

Eu gostaria de saber sobre o tamanho de uma matriz que está sendo alocado ao olhar para o bytecode, se essa informação é conhecido em tempo de compilação, é claro.

Fundo: Eu quero escrever um detector FindBugs (que analisa o bytecode compilado) e relatar certas ocorrências de alocações de matriz. A fim de filtro de falsos positivos que eu não estou interessado em "pequenos" matrizes, mas únicos cujo tamanho não está disponível em tempo de compilação ou que são maiores do que um limite configurável.

Como o código fonte FindBugs não está muito bem documentada, eu estou procurando algumas dicas sobre como começar -. Talvez já existe uma dectector fazendo algo semelhante que eu poderia olhar

Foi útil?

Solução

Esta poderia começar espécie de complicado. Meu conhecimento é incompleto, mas você vai ter pelo menos três tipos de instruções de olhar para fora (newArray, ANEWARRAY e MULTIANEWARRAY). Olhando para a instrução anterior (ou no caso de MULTIANEWARRAY, n instruções anteriores) recebe o tamanho, que mesmo que fosse uma constante pode ser carregado com BIPUSH, SIPUSH ou LDC (qualquer outra coisa?), Dependendo no tamanho. Como você observou, se a classe é o resultado de um cálculo, você pode estar traçando instruções backup indefinidamente.

Se bem me lembro, FindBugs usa o BCEL internamente, mas eu nunca tinha escavado em torno de lá para ver exatamente o quão espertos eles estão sendo. Se qualquer uma dessas equipes têm listas de discussão apropriados, eles podem revelar-se um lugar melhor para pedir -. Eles provavelmente pelo menos saber se alguém tem sido por este caminho antes

Outras dicas

Bem, se eles são alocados com base em uma constante, você pode verificar se há uma constante que foi empurrado um pouco antes da alocação. Por exemplo:

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];
    }
}

dá a bytecode:

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top