Software in grado di analizzare il codice sorgente per individuare:
L’analisi automatica del proprio codice consente di migliorare la qualità del codice, aiuta ad apprendere il modo corretto di scrivere, riduce il costo di manutenzione, e garantisce uniformità fra le parti sviluppate da persone diverse (aiutando quindi il sistema di controllo versione!).
I software che vedremo sono eseguibili in due modalità:
Noi vedremo la terza modalità.
SpotBugs scansiona il bytecode generato dal compilatore, e dalla sua analisi cerca di scoprire potenziali bug nel sorgente, ad esempio:
float
o double
==
invece di equals()
PMD si occupa di trovare imperfezioni nel codice:
Cos’è: Checkstyle si occupa di trovare errori di stile:
Ciascun tool di quelli introdotti ha un proprio plugin gradle che consente di attivarlo e configurarlo.
Per gli scopi del corso, è stato sviluppato un plugin che applica i tre plugin precedenti, preconfigurandoli in modo “ragionevole”.
plugins {
id("org.danilopianini.gradle-java-qa") version "1.75.0"
}
di default, questo causa un fallimento della build se ci sono errori in analisi statica:
la configurazione è aggressiva.
Plugin
Aggressività
Build reports
Osservato \ Reale | Vero | Falso |
---|---|---|
Vero | Positivo | Falso positivo |
Falso | Falso negativo | Negativo |
Sensibilità e specificità spesso vanno bilanciate, raramente in casi reali un test può essere sia molto sensibile che molto specifico
(ci saranno anche falsi negativi, ma è più difficile trovarli…)
La ragione per cui un caso di problema sia da classificare come falso positivo va studiata
In questi casi, si disabilita puntualmente l’analisi statica nel punto in cui è presente il falso positivo
Questa operazione è detta soppressione e va sempre giustificata
// CHECKSTYLE: <ruleName> OFF
<java code with the false positive>
// CHECKSTYLE: <ruleName> ON
<ruleName>
va sostituito col nome della regola di Checkstyle che si sta violandoÈ bene aggiungere un commento che spieghi la ragione della soppressione
// CHECKSTYLE: <ruleName> OFF
// Rule disabled due to false positives, see this bug report: https://...
<java code with the false positive>
// CHECKSTYLE: <ruleName> ON
<java code with the false positive> // NOPMD suppressed as it is a false positive
Se la linea di codice diventa troppo lunga, si può spezzare:
<java code with the false positive> // NOPMD
// suppressed as it is a false positive
Spotbugs lavora sul bytecode, quindi non può essere soppresso usando dei commenti
Occorre invece usare una speciale annotazione, contenuta nella libreria:
E quindi, in build.gradle.kts
dependencies {
compileOnly("com.github.spotbugs:spotbugs-annotations:4.7.3") // Use the latest version
}
Sarà a questo punto disponibile l’annotazione @SuppressFBWarnings
:
@SuppressFBWarnings(
value = { // List of bugs to be suppressed
"BC_UNCONFIRMED_CAST_OF_RETURN_VALUE",
"RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"
}, // String with the reasons for them to be suppressed
justification = "A ChoiceDialog is always in its own stage"
+ ", and we don't need the status of the Runnable"
)
<java code with the false positive>