Introduktion til FindBugs

1. Oversigt

FindBugs er et open source-værktøj, der bruges til at udføre statisk analyse på Java-kode.

I denne artikel skal vi se på opsætning af FindBugs på et Java-projekt og integrering af det i IDE og Maven-bygningen.

2. FindBugs Maven-plugin

2.1. Maven-konfiguration

For at starte generering af statiske analyserapporter skal vi først tilføje FindBugs-pluginet i vores pom.xml:

   org.codehaus.mojo findbugs-maven-plugin 3.0.4 

Du kan tjekke den nyeste version af pluginet på Maven Central.

2.2. Rapportgenerering

Nu hvor vi har Maven-pluginet korrekt konfigureret, lad os generere projektdokumentationen ved hjælp af mvn websted kommando.

Rapporten genereres i mappen mål / sted i projektmappen under navnet findbugs.html.

Du kan også køre mvn findbugs: gui kommando til at starte GUI-grænsefladen for at gennemse de genererede rapporter for det aktuelle projekt.

FindBugs-pluginet kan også konfigureres til at mislykkes under visse omstændigheder - ved at tilføje eksekveringsmålet kontrollere til vores konfiguration:

 org.codehaus.mojo findbugs-maven-plugin 3.0.4 Maks kontrol 

Det indsats - når det maksimeres, udfører en mere komplet og præcis analyse, der afslører flere fejl i koden, men det bruger flere ressourcer og tager mere tid at gennemføre.

Du kan nu køre kommandoen mvn verificere, for at kontrollere, om bygningen vil lykkes eller ej - afhængigt af de mangler, der er opdaget under kørslen af ​​analysen.

Du kan også forbedre rapportgenereringsprocessen og tage mere kontrol over analysen ved at tilføje nogle grundlæggende konfigurationer til plugindeklarationen:

 org.baeldung.web.controller. * FindNullDeref FindReturnRef 

Det kun analyser option erklærer kommaseparerede værdier for klasser / pakker, der er kvalificerede til analyse.

Det besøgende/omitVisitors optioner er også kommaseparerede værdier, de bruges til at specificere, hvilke detektorer der skal / ikke skal køres under analysen - Bemærk det besøgende og omitVisitors kan ikke bruges på samme tid.

En detektor specificeres af klassens navn uden nogen pakkekvalifikation. Find detaljerne i alle tilgængelige detektorer klassenavne ved at følge dette link.

3. FindBugs Eclipse-plugin

3.1. Installation

IDE-installationen af ​​FindBugs Plugin er ret ligetil - du skal bare bruge softwareopdateringsfunktionen i Eclipse, med følgende opdateringswebsted: //findbugs.cs.umd.edu/eclipse.

For at sikre, at FindBugs er korrekt installeret i dit Eclipse-miljø, skal du kigge efter den indstilling, der er mærket FindBugs under Windows -> Indstillinger -> Java.

3.2. Rapporter browsing

For at starte en statisk analyse på et projekt ved hjælp af FindBugs Eclipse-plugin, skal du højreklikke på projektet i pakkeudforskeren og derefter klikke på indstillingen mærket find bugs.

Efter lanceringen viser Eclipse resultaterne under vinduet Bug Explorer som vist i skærmbilledet nedenfor:

Fra og med version 2 begyndte FindBugs at rangere fejl med en skala fra 1 til 20 for at måle sværhedsgraden af ​​mangler:

  • Det skræmmende: rangeret mellem 1 og 4.
  • Skræmmende: rangeret mellem 5 og 9.
  • Urolig: rangeret mellem 10 og 14.
  • Af bekymring: rangeret mellem 15 og 20.

Mens bugrangeringen beskriver sværhedsgraden, afspejler tillidsfaktoren sandsynligheden for, at disse bugs bliver markeret som reelle. Tilliden blev oprindeligt kaldt prioritet, men det blev omdøbt i den nye version.

Naturligvis kan nogle defekter være åbne for fortolkning, og de kan endda eksistere uden at skade den ønskede opførsel af en software. Derfor er vi i en reel situation nødt til at konfigurere statiske analyseværktøjer korrekt ved at vælge et begrænset sæt defekter, der skal aktiveres i et specifikt projekt.

3.3. Formørkelse af formørkelse

FindBugs-plugin gør det nemt at tilpasse strategien for fejlanalyse ved at tilbyde forskellige måder at filtrere advarsler på og begrænse strengheden af ​​resultaterne. Du kan kontrollere konfigurationsgrænsefladen ved at gå til Vindue -> Indstillinger -> Java -> FindBugs:

Du kan frit fjerne markeringen af ​​uønskede kategorier, hæve minimumrangeringen for at rapportere, angive den mindste tillid, der skal rapporteres, og tilpasse markører til bugs-rækker - Advarsel, Info eller Fejl.

FindBugs deler mangler i mange kategorier:

  • Korrekthed - samler generelle bugs, f.eks. uendelige sløjfer, upassende brug af lige med(), etc
  • Dårlig praksis, f.eks. undtagelse håndtering, åbnede streams, strenge sammenligning osv
  • Ydeevne, f.eks. inaktive genstande
  • Multithreaded korrekthed - samler synkroniseringsinkonsekvenser og forskellige problemer i et miljø med flere tråde
  • Internationalisering - samler problemer relateret til kodning og applikations internationalisering
  • Sårbarhed med ondsindet kode - samler sårbarheder i kode, f.eks. kodestykker, der kan udnyttes af potentielle angribere
  • Sikkerhed - samler sikkerhedshuller relateret til specifikke protokoller eller SQL-injektioner
  • Dodgy - samler kodelugt, f.eks. ubrugelige sammenligninger, nulchecks, ubrugte variabler osv

Under Detektorkonfiguration fane, kan du kontrollere de regler, du skal respektere i dit projekt:

Hastighedsattributten afspejler, hvor dyr analysen vil være. Jo hurtigst detektoren er, den mindste ressource der forbruges til at udføre den.

Du kan finde den udtømmende liste over fejl, der er genkendt af FindBugs på officiel dokumentationsside.

Under Filtrer filer i panelet, kan du oprette brugerdefinerede filfiltre for at inkludere / ekskludere dele af kodebasen. Denne funktion er nyttig - for eksempel - når du vil forhindre "ikke-administreret" eller "papirkurven" kode, der mangler at dukke op i rapporterne eller måske ekskluderer alle klasser fra testpakken.

4. FindBugs IntelliJ IDEA-plugin

4.1. Installation

Hvis du er en IntelliJ IDEA-fan, og du vil begynde at inspicere Java-kode ved hjælp af FindBugs, kan du blot hente plugin-installationspakken fra det officielle JetBrains-websted og udpakke den til mappen% INSTALLATION_DIRECTORY% / plugins. Genstart din IDE, og du er klar til at gå.

Alternativt kan du navigere til Indstillinger -> Plugins og søge i alle arkiver efter FindBugs-plugin.

På tidspunktet for denne artikels skrivning er version 1.0.1 af IntelliJ IDEA-pluginet lige ude,

For at sikre, at FindBugs-pluginet er korrekt installeret, skal du kontrollere indstillingen mærket "Analyser projektkode" under Analyser -> FindBugs.

4.2. Rapporter browsing

For at starte statisk analyse i IDEA skal du klikke på “Analyser projektkode” under Analyser -> FindBugs og derefter kigge efter FindBugs-IDEA-panelet for at inspicere resultaterne:

Du kan bruge den anden kolonne med kommandoer i venstre side af skærmbilledet til at gruppere defekter ved hjælp af forskellige faktorer:

  1. Gruppér efter en bugkategori.
  2. Gruppér efter klasse.
  3. Gruppér efter en pakke.
  4. Gruppér efter en bugrangering.

Det er også muligt at eksportere rapporterne i XML / HTML-format ved at klikke på "eksport" -knappen i den fjerde kolonne med kommandoer.

4.3. Konfiguration

FindBugs-plugin-præferencesiderne i IDEA er ret selvforklarende:

Dette indstillingsvindue ligner det, vi har set i Eclipse, så du kan udføre alle former for konfiguration på en analog måde, startende fra analyseindsatsniveau, fejlrangering, tillid, klassefiltrering osv.

Du kan få adgang til præferencepanelet i IDEA ved at klikke på ikonet "Plugin-præferencer" under FindBugs-IDEA-panelet.

5. Rapportanalyse for Spring-Rest-projektet

I dette afsnit vil vi kaste lys over en statisk analyse udført på projektet om fjederhvile, der er tilgængeligt på Github som et eksempel:

De fleste af manglerne er mindre - af bekymring, men lad os se, hvad vi kan gøre for at rette nogle af dem.

Metoden ignorerer ekstraordinær returværdi:

File fileServer = ny fil (filnavn); fileServer.createNewFile ();

Som du sikkert kan gætte, klager FindBugs over det faktum, at vi smider returværdien af createNewFile () metode. En mulig løsning ville være at gemme den returnerede værdi i en nyligt deklareret variabel og derefter logge noget meningsfuldt ved hjælp af DEBUG-logniveauet - f.eks. “Den navngivne fil findes ikke og blev oprettet”Hvis den returnerede værdi er sand.

Metoden kan muligvis ikke lukke stream på undtagelse: denne særlige mangel illustrerer en typisk brugssag til undtagelseshåndtering, der antyder at luk altid vandløb i en langt om længe blok:

prøv {DateFormat dateFormat = ny SimpleDateFormat ("åååå_MM_dd_HH.mm.ss"); String fileName = dateFormat.format (ny dato ()); File fileServer = ny fil (filnavn); fileServer.createNewFile (); byte [] bytes = file.getBytes (); BufferedOutputStream stream = ny BufferedOutputStream (ny FileOutputStream (fileServer)); stream.write (bytes); stream.close (); returner "Du har uploadet" + brugernavn; } fange (Undtagelse e) {return "Du kunne ikke uploade" + e.getMessage (); }

Når en undtagelse kastes før stream.close () instruktion, stream er aldrig lukket, det er derfor, det altid foretrækkes at benytte sig af langt om længe{} blokere for at lukke vandløb åbnet under en prøve/fangst rutine.

En Undtagelse bliver fanget når Undtagelse kastes ikke: Som du måske allerede ved, fanger Undtagelse er en dårlig kodning, FindBugs mener, at du skal fange en mest specifik undtagelse, så du kan håndtere det ordentligt. Så dybest set manipulere streams i en Java-klasse, fange IOUndtagelse ville være mere passende end at fange en mere generisk undtagelse.

Felt ikke initialiseret i konstruktøren, men derferferences uden nul kontrol: det er altid en god idé at initialisere felter inde i konstruktører, ellers skal vi leve med muligheden for, at koden hæver en NPE. Således anbefales det at udføre nulchecks, når vi ikke er sikre på, om variablen er initialiseret korrekt eller ej.

6. Konklusion

I denne artikel har vi dækket de grundlæggende nøglepunkter til brug og tilpasning af FindBugs i et Java-projekt.

Som du kan se, er FindBugs et kraftfuldt, men alligevel enkelt statisk analyseværktøj, det hjælper med at opdage potentielle kvalitetshuller i dit system - hvis de er tunet og brugt korrekt.

Endelig er det værd at nævne, at FindBugs også kan køres som en del af et separat kontinuerligt automatisk kodevurderingsværktøj som Sputnik, hvilket kan være meget nyttigt at give rapporterne meget mere synlighed.

Eksempelkoden, vi brugte til statisk analyse, er tilgængelig på Github.