2010-06-01 34 views
7

Recientemente comencé a usar la herramienta de análisis estático de findbugs en una compilación java que estaba haciendo. El primer informe regresó con un montón de advertencias de alta prioridad. Siendo el tipo de persona obsesiva, estaba listo para ir a todos. Sin embargo, debo estar perdiendo algo. Recibo la mayoría de las advertencias cuando comparo cosas. Como el siguiente código:Findbugs y comparando

public void setSpacesPerLevel(int value) 
    { 
     if(value >= 0) 
     { 
     spacesPerLevel = value; 
     } 
     else 
     { 
     spacesPerLevel = 0; 
     } 
    } 

produce una advertencia de prioridad alta en la instrucción if que se lee.

del archivo: Indenter.java, línea: 60, Tipo: BIT_AND_ZZ, Prioridad: alta, Categoría: CORRECCIÓN Compruebe para ver si ((...) & 0) == 0 en muestra. Indenter.setSpacesPerLevel (int)

Estoy comparando un int con un int, parece una cosa en común. Obtengo bastantes de ese tipo de error con comparaciones simples similares.

Tengo muchas otras advertencias de alta prioridad en lo que parecen ser simples bloques de código. ¿Me estoy perdiendo de algo? Me doy cuenta de que el análisis estático puede producir falsos positivos, pero los errores que estoy viendo parecen demasiado triviales como para ser un falso positivo.

Este me tiene a mí también rascándome la cabeza.

for(int spaces = 0;spaces < spacesPerLevel;spaces++) 
    { 
     result = result.concat(" "); 
    } 

que da la advertencia findbugs siguientes:

File: Indenter.java, Line: 160, Type: IL_INFINITE_LOOP, Priority: High, Category: CORRECTNESS 

There is an apparent infinite loop in sample.Indenter.indent() 

This loop doesn't seem to have a way to terminate (other than by perhaps throwing an exception). 

¿Alguna idea?

Así que básicamente tengo un puñado de archivos y 50-60 advertencias de alta prioridad similares a las de arriba. Estoy usando findbugs 1.3.9 y decir que es a partir de los findbugs tarea ant

ACTUALIZACIÓN: He esta acumulación de ser ejecutado por un servidor de Hudson y tenía el código que está siendo instrumentado por el trébol de cobertura de código. Cuando lo apagué, todas mis advertencias de alta prioridad desaparecieron. Eso tiene sentido ahora. Gracias por la respuesta.

+0

Esto podría ser un bucle infinito si está cambiando spacesPerLevel dentro del bucle, por ejemplo. spacesPerLevel = espacios + 2; o disminuyendo espacios. – Anton

+0

Acabo de actualizar la pregunta para contener más los fragmentos de código –

+0

¿Está compilando con información de depuración? – Anton

Respuesta

7

ACTUALIZACIÓN: Tengo una versión que está siendo ejecutada por un servidor hudson y el código fue instrumentado por Clover para la cobertura del código. Cuando lo apagué, todas mis advertencias de alta prioridad desaparecieron. Eso tiene sentido ahora. Gracias por la respuesta.

1

¿Está ejecutando Findbugs a través de Eclipse plugin, ant o gui? ¿Es posible que el código no se haya recompilado desde que lo ejecutó (antes de realizar cambios)?

si setSpacesPerLevel no es demasiado largo, publicar la salida de

javap -v TheClassThatContainssetSpacerPerLevel

En cuanto al segundo error, que tendría que mostrar a todo el bucle antes de que uno podría decir si era un problema.

+0

lo estoy ejecutando de hormiga. El objetivo realiza una limpieza antes de realizar cualquier construcción o análisis estático. Trabajando en la salida de javap ... –

3

Una nota al margen:

for(int spaces = 0;spaces < spacesPerLevel;spaces++) 
{ 
    result = result.concat(" "); 
} 

Si result es una java.lang.String, esto puede ser ineficaz, como lo hace los siguientes pasos para cada carácter de espacio:

  1. crear un nuevo char[] para sujetar el resultado de la concatenación
  2. crear una nueva instancia java.lang.String que se envuelve alrededor de la matriz de caracteres

Si hace esto repetidamente, especialmente cuando result ya es largo, esto lleva mucho tiempo.

Si el rendimiento (tanto de tiempo como de memoria) es importante para ese método, debería considerar usar un StringBuilder (no seguro para subprocesos) o un StringBuffer (seguro para subprocesos).

+0

¡Gracias! Transmití este código de .NET (estoy un poco oxidado en el departamento de Java). Había un constructor en la clase .NET String que estábamos usando que te permitía repetir un personaje X veces. Esta fue mi solución rápida y sucia, pero fealt mal desde el principio. ¡Gracias! –