Pregunta

Hola, tengo algún código que se informa que tiene el problema np_guaranted_deref por FindBugs. Ahora que mira mi código, no entiendo qué le pasa, ¿alguien puede sugerir cuál es el problema?

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 perforando el error en FindBugs resalta las dos tareas a var = null; Como motivo del error, pero no entiendo por qué. No es como si realmente estuviera haciendo nada con el var OBJETO Simplemente estoy haciendo un cheque nulo. El ejemplo se toma del código de producción real pero despojado de cualquier cosa que no se necesitara para reproducir el error. Lo que me pregunto si esto es un falso positivo o no. Y si no lo que sería una solución apropiada.

Aquí está el enlace al detalle del error FindBugs: http://findbugs.sourceforge.net/bugdescriptions.html#np_guaranted_deref

Actualización] Después de recibir algunos comentarios sobre este problema, ahora he registrado esto como un falso positivo en el bugtracker de FindBugs 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í.

¿Fue útil?

Solución

Ya veo. Puedo confirmar el mismo comportamiento de FB en mi computadora. Parece de hecho extraño. Qué es gracioso, que si reemplazas throw new NullPointerException con throw new RuntimeException El marcador de errores desaparecería.

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

Otros consejos

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

Ok, lo que FindBugs está buscando es una declaración o rama que garantice una excepción de puntero nulo. Originalmente, solo buscamos desferencias de valores nulos. Más tarde aumentamos el análisis para tratar

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

lo mismo que una deserferencia explícita de x. Esto fue principalmente para ayudar al análisis interprocedural, de modo que los métodos que tenían verificaciones nulas explícitas para sus parámetros tratarían lo mismo que los métodos que deseleren sus parámetros sin verificaciones nulas explícitas, e informarían errores cuando se pasan valores nulos para dichos parámetros.

Por lo tanto, parte del texto en nuestros msgs de error podría necesitar actualizarse, pero realmente no hemos encontrado muchos casos realistas en los que cause confusión.

No estoy muy 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?

Mirando más de cerca la definición del mensaje de error aquí, dice:

Hay una declaración o rama de que si se ejecuta garantiza que un valor es nulo en este punto, y ese valor garantizado para ser desamado (excepto en rutas a la que implican excepciones de tiempo de ejecución)

Lo que me hace pensar que es solo hacerle saber que Var será nulo o algo realmente está haciendo que FindBugs piense que VAR se hace referencia dentro de la declaración IF.

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

Lo único que podría cambiar es escribir la comparación al revés, así:

if (null == var)

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top