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.