2011-03-16 11 views
5

Hola He conseguido algo de código que se reporta como teniendo el problema NP_GUARANTEED_DEREF por Findbugs. Ahora, al mirar mi código, no entiendo muy bien qué tiene de malo, ¿alguien puede sugerir cuál es el problema?cómo solucionar el problema Findbugs "valor nulo se garantiza que sea dereferenced" NP_GUARANTEED_DEREF

public void test() { 
    String var = ""; 
    int index = 2; 
    if (index == -1) { 
    var = String.class.getName(); 
    if (var.length() == 0) { 
     var = null; 
    } 
    } else { 
    var = Integer.class.getName(); 
    if (var.length() == 0) { 
     var = null; 
    } 
    } 
    if (var == null) {// FINBUGS reports on this line NP_GUARANTEED_DEREF 
    /* 
    * There is a statement or branch that if executed guarantees that a value 
    * is null at this point, and that value that is guaranteed to be 
    * dereferenced (except on forward paths involving runtime exceptions). 
    */ 
    throw new NullPointerException("NULL"); 
    } 
} 

Ahora perforación en el error en Findbugs se destacan las dos asignaciones a var = null; como causa del fallo, pero no acabo de entender por qué. No es que realmente esté haciendo algo con el objeto var. Solo estoy haciendo una comprobación nula. El ejemplo se toma del código de producción real, pero se despoja de todo lo que no era necesario para reproducir el error. Lo que me pregunto si esto es un falso positivo o no. Y si no, ¿cuál sería una solución adecuada?

Aquí está el enlace a la Bug Detalle Findbugs: http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF

[ACTUALIZACIÓN] Después está recibiendo algunos comentarios sobre este tema ahora he conectado esto como un falso positivo en el Findbugs Bugtracker en Sourceforge el enlace es https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693

La conversación sobre el problema continuará allí.

+0

¿Alguna vez tuvo 'var.equals (null)' antes? ¿Estás seguro de que has vuelto a ejecutar Findbugs en ese archivo (lo que suelo hacer es llamar a los "limpiadores de errores"). –

+0

Sí, estoy seguro de que he vuelto a ejecutar Findbugs, y no, nunca fue 'var.equals (null)' si fuera que sería fácilmente comprensible. Como jzd dijo que no se ve mal. Si recibo más confirmación de que esto no se ve mal, probablemente publique un error para (falso positivo) con Findbugs – AGrunewald

+0

que veo. Puedo confirmar el mismo comportamiento de FB en mi computadora. Parece extraño de verdad. Lo que es gracioso es que si reemplazaste 'throw new NullPointerException' con' throw new RuntimeException' desaparecería el marcador de error. –

Respuesta

5

veo. Puedo confirmar el mismo comportamiento de FB en mi computadora. Parece extraño de verdad. Lo curioso es que si reemplazaba throw new NullPointerException por throw new RuntimeException, el marcador de error desaparecería.

Ahora creo que entiendo lo que han querido decir. La redacción del mensaje no es exacta, pero te advierten contra un NPE. Supongo que consideran explotar explícitamente a NPE como una mala práctica.

0

Mirando más de cerca en la definición del mensaje de error here, que dice:

Hay una afirmación o una rama que si garantías ejecutadas que un valor es nula en este punto, y que el valor que se garantiza que sea dereferenced (excepto los caminos a seguir que implican excepciones de tiempo de ejecución)

que me hace pensar que es o bien simplemente dejar que kN ow var va a ser nulo o algo realmente está haciendo que findbugs piense que se hace referencia a var dentro de la sentencia if.

El código que publicó se ve bien, verificaría que no se acceda a var en el código verdadero.

La única cosa que podría cambiar es escribir la comparación hacia atrás, así:

if (null == var) 

De esa manera es obvio si dejar de lado uno de los = 's/

+0

Gracias por la respuesta jzd, aunque estoy de acuerdo con usted en el intercambio de la comparación, lamentablemente no cambia lo que informa Findbugs. – AGrunewald

+0

@Agrune, busqué la definición y ahora me siento mejor con mi respuesta. Lo he actualizado para incluir la definición. – jzd

3

Es un error en FindBugs, publique este problema en su página de seguimiento de problemas. findbugs.sf.net

+0

gracias sí, de hecho es un error, la lista de correo dio la misma respuesta. Lo archivaré como un error y actualizaré mi pregunta en consecuencia. – AGrunewald

2

OK, lo FindBugs está buscando es una declaración o una rama que está garantizado para dar lugar a una excepción de puntero nulo. Originalmente, solo buscamos desreferencias de valores nulos.Más tarde aumentó el análisis para tratar

if (x == null) throw new NullPointerException()

lo mismo que un desreferenciar explícito de x. Esto fue principalmente para ayudar al análisis interprocedural, por lo que los métodos que tenían comprobaciones nulas explícitas para sus parámetros se tratarían de la misma manera que los métodos que desreferencian sus parámetros sin verificaciones nulas explícitas e informan errores cuando se pasan valores nulos para dichos parámetros.

Por lo tanto, parte del texto en nuestros mensajes de error podría necesitar ser actualizado, pero realmente no hemos encontrado muchos casos realistas donde haya confusión.

No estoy seguro de cuál es el propósito del código anterior. En los puntos donde está asignando null a var, está creando una situación que conducirá a un lanzamiento explícito de una excepción de puntero nulo más abajo. ¿Ese es realmente el comportamiento que quieres?

+0

La conversación continúa en el rastreador de errores de SourceForge. Consulte https://sourceforge.net/tracker/?func=detail&aid=3277814&group_id=96405&atid=614693. – AGrunewald

Cuestiones relacionadas