Pregunta

Me gustaría averiguar sobre el tamaño de una matriz ser asignados por mirar el código de bytes, si esa información se conoce en tiempo de compilación, por supuesto.

Antecedentes: Quiero escribir un detector FindBugs (que se ve en el código de bytes compilado) e informar de ciertas ocurrencias de las asignaciones de matriz. Con el fin de filtrar los falsos positivos no estoy interesado en arrays "pequeñas", pero únicos cuyo tamaño no está disponible en tiempo de compilación o que son más grandes que un umbral configurable.

A medida que el código fuente FindBugs no está demasiado documentado, Busco algunos consejos sobre cómo empezar - tal vez ya hay una Dectector hacer algo similar que pudiera mirar a

.
¿Fue útil?

Solución

Esto podría conseguir un poco complicado. Mi conocimiento es incompleto, pero tendrá al menos tres tipos de instrucciones a tener en cuenta (newArray, ANEWARRAY y MULTIANEWARRAY). En cuanto a la instrucción anterior (o en el caso de MULTIANEWARRAY, n las instrucciones anteriores) Obtiene el tamaño, que incluso si era una constante podría ser cargado con BIPUSH, SIPUSH o LDC (algo más?) Dependiendo en el tamaño. Como se ha señalado, si la clase es el resultado de un cálculo, se le puede trazando las instrucciones de forma indefinida.

Si no recuerdo mal, FindBugs utiliza el BCEL internamente, pero nunca he cavado por allí para ver exactamente lo inteligente que están siendo. Si cualquiera de esos equipos tienen listas de distribución adecuados, que pueden resultar un mejor lugar para preguntar -. Probablemente van a al menos saber si alguien ha pasado por esto antes

Otros consejos

Bueno, si se asignan en función de una constante, se puede comprobar si hay una constante que fue empujado justo antes de la asignación. Por ejemplo:

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

da el código de bytes:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top