Nástroje statické analýzy mohou nalézt pravděpodobná problémová místa. Občas ale překvapí tím, že některé triviální chyby jim uniknou mezi prsty. Například při kompilaci Java 6.0 nebo v Eclipse 3.4 nenalezne FindBugs v1.3.8 v následující metodě nic podezřelého:
public String testStringBuilder( final String what, final int times ) { String result = ""; for ( int i = 0; i < times; i++ ) result += what; return result; }
Měl by ovšem detekovat SBSC_USE_STRINGBUFFER_CONCATENATION (Method concatenates strings using + in a loop). Proč to nefunguje? FindBugs pracuje na úrovni byte kódu, podívejme se tedy na (dekompilovaný) bytekód generovaný z Java 6 a Eclipse:
String result = ""; for(int i = 0; i < times; i++) result = (new StringBuilder(String.valueOf(result))).append(what).toString(); return result;
Bytekód generovný z Java 5 je odlišný (zvláštní, StringBuilder(String s) byl už v Java 5, proč ho nepoužili?) a na tomto bytekódu FindBugs problém nalezne:
String s1 = ""; for(int j = 0; j < i; j++) s1 = (new StringBuilder()).append(s1).append(s).toString(); return s1;
Chybu jsem zareportoval.