2011-07-27 14 views
6

Code Review narzędzia narzeka Możliwa wartość null pointer dereference z safeScanWarnings w saveSafeScan (...) Na linii if (safeScanWarnings! = Null & safeScanWarnings.size()> 0)Wyjaśnienie i naprawić za ewentualne pustego wskaźnika dereference z

Zastanawiam się, jak to jest możliwe? Czy to dlatego, że zwracamy kolekcję przez odniesienie?

protected void saveSafeScan(final Response response, final Dtec dtec) throws dtecException 
    { 
     Collection<String> safeScanWarnings = dtec.getSafeScanWarnings(); 
     if (safeScanWarnings!=null && safeScanWarnings.size()>0) 
     { 
      Iterator<String> iterator = safeScanWarnings.iterator(); 

      int i = 0; 
      while (iterator.hasNext()) 
      { 
       String safeScanCode = iterator.next(); 
       if (i == 0) 
       { 
        response.setSafeScanCode(safeScanCode); 
        response.setSafeScanCodeText(getMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s", 
          StringUtils.trimToEmpty(safeScanCode)))); 
       } 
       SafeScanWarning safeScan = new SafeScanWarning(); 
       safeScan.setCode(safeScanCode); 
       safeScan.setMessage(String.format("DTECRESPONSE_SAFESCANCODE_%s", StringUtils.trimToEmpty(safeScanCode))); 
       safeScan.setPriority(i); 
       response.getSafeScanWarnings().add(safeScan); 
       i++; 
      } 
     } 
    } 
+5

Chociaż w przykładzie kod jest poprawny w swojej błędu, jeśli ma '&' a nie '' &&. Upewnij się więc, że w prawdziwym kodzie jest to ocena shortcircuit. Jeśli tak już jest, jest to błąd w narzędziu. – Voo

+0

zauważ, że komentarz powyżej przykładowego kodu to 'if (safeScanWarnings! = Null & safeScanWarnings.size()> 0)' który jest nieprawidłowy (buggy) – MeBigFatGuy

Odpowiedz

10

Jeśli rzeczywiście wskazuje na tę linię, wygląda na to, że jest to błąd w narzędziu przeglądu kodu.

Ponieważ jest to zmienna lokalna, nie ma szans, że zostanie zmieniona przez cokolwiek innego między sprawdzaniem nieważności a rozmową size() - więc nie ma mowy, aby rzucił NullPointerException.

0

Istnieje gałąź oświadczenia, która, jeśli zostanie wykonana, gwarantuje, że wartość null zostanie dereferencjonowana, co spowoduje wygenerowanie NullPointerException podczas wykonywania kodu. Oczywiście problem może polegać na tym, że gałąź lub oświadczenie jest niewykonalne i że nie można rzucać w ogóle na numer NullPointerException. Podejmowanie decyzji wykracza poza możliwości FindBugs.

0

Atrybut "DTEC" należy securised:

if (null!=dtec && null!=safeScanWarnings && safeScanWarnings.size()>0) 
    { 
     Collection<String> safeScanWarnings = dtec.getSafeScanWarnings(); 
Powiązane problemy