Inleiding tot FindBugs

1. Overzicht

FindBugs is een open source-tool die wordt gebruikt om te presteren statische analyse op Java-code.

In dit artikel gaan we kijken naar het opzetten van FindBugs op een Java-project en het integreren in de IDE en de Maven-build.

2. FindBugs Maven-plug-in

2.1. Maven-configuratie

Om statische analyserapporten te genereren, moeten we eerst de FindBugs-plug-in toevoegen aan onze pom.xml:

   org.codehaus.mojo findbugs-maven-plugin 3.0.4 

Je kunt de nieuwste versie van de plug-in bekijken op Maven Central.

2.2. Rapport genereren

Nu we de Maven-plug-in correct hebben geconfigureerd, gaan we de projectdocumentatie genereren met behulp van de mvn-site opdracht.

Het rapport wordt gegenereerd in de map doel / site in de projectdirectory onder de naam findbugs.html.

U kunt ook het mvn findbugs: gui opdracht om de GUI-interface te starten om door de gegenereerde rapporten voor het huidige project te bladeren.

De FindBugs-plug-in kan ook worden geconfigureerd om onder bepaalde omstandigheden te mislukken - door het uitvoeringsdoel toe te voegen controleren naar onze configuratie:

 org.codehaus.mojo findbugs-maven-plugin 3.0.4 Max check 

De inspanning - als het maximaal is, voert het een completere en nauwkeurigere analyse uit, waarbij meer bugs in de code worden onthuld, maar het verbruikt meer bronnen en kost meer tijd om te voltooien.

U kunt nu de opdracht uitvoeren mvn verifiëren, om te controleren of de build zal slagen of niet, afhankelijk van de defecten die zijn gedetecteerd tijdens het uitvoeren van de analyse.

U kunt ook het proces voor het genereren van rapporten verbeteren en meer controle krijgen over de analyse door een basisconfiguratie toe te voegen aan de plug-in-declaratie:

 org.baeldung.web.controller. * FindNullDeref FindReturnRef 

De alleen analyseren optie declareert door komma's gescheiden waarden van klassen / pakketten die in aanmerking komen voor analyse.

De bezoekers/weglatenBezoekers opties zijn ook door komma's gescheiden waarden, ze worden gebruikt om aan te geven welke detectoren wel en niet moeten worden uitgevoerd tijdens de analyse - Merk op dat bezoekers en weglatenBezoekers kunnen niet tegelijkertijd worden gebruikt.

Een detector wordt gespecificeerd door zijn klassenaam, zonder enige kwalificatie van het pakket. Vind de details van alle beschikbare detectorklassen door deze link te volgen.

3. FindBugs Eclipse-plug-in

3.1. Installatie

De IDE-installatie van de FindBugs-plug-in is vrij eenvoudig - u hoeft alleen de software-updatefunctie in Eclipse te gebruiken, met de volgende updatesite: //findbugs.cs.umd.edu/eclipse.

Om er zeker van te zijn dat FindBugs correct is geïnstalleerd in uw Eclipse-omgeving, zoekt u naar de optie met het label FindBugs onder Windows -> Voorkeuren -> Java.

3.2. Rapporten browsen

Om een ​​statische analyse van een project te starten met behulp van de FindBugs Eclipse-plug-in, moet u met de rechtermuisknop op het project in de pakketverkenner klikken en vervolgens op de optie met het label vind bugs.

Na het opstarten toont Eclipse de resultaten onder het Bug Explorer-venster zoals weergegeven in de onderstaande schermafbeelding:

Vanaf versie 2 is FindBugs begonnen met het rangschikken van bugs met een schaal van 1 tot 20 om de ernst van defecten te meten:

  • Het engste: gerangschikt tussen 1 en 4.
  • Eng: gerangschikt tussen 5 en 9.
  • Verontrustend: gerangschikt tussen 10 en 14.
  • Van zorg: gerangschikt tussen 15 en 20.

Hoewel de bug-rangorde de ernst beschrijft, geeft de betrouwbaarheidsfactor de waarschijnlijkheid weer dat deze bugs als echte worden gemarkeerd. Het vertrouwen heette oorspronkelijk prioriteit, maar het werd hernoemd in de nieuwe versie.

Natuurlijk kunnen sommige defecten vatbaar zijn voor interpretatie, en ze kunnen zelfs bestaan ​​zonder het gewenste gedrag van software te schaden. Daarom moeten we in een reële situatie statische analysetools correct configureren door een beperkt aantal defecten te kiezen om in een specifiek project te activeren.

3.3. Eclipse-configuratie

De FindBugs-plug-in maakt het gemakkelijk om de analysestrategie voor bugs aan te passen, door verschillende manieren aan te bieden om waarschuwingen te filteren en de striktheid van de resultaten te beperken. U kunt de configuratie-interface controleren door naar Venster -> Voorkeuren -> Java -> FindBugs te gaan:

U kunt ongewenste categorieën vrijelijk uitschakelen, de minimale rangorde verhogen om te rapporteren, de minimale betrouwbaarheid specificeren om te rapporteren, en markeringen aanpassen voor bugsrangen - Waarschuwing, Info of Fout.

FindBugs verdelen defecten in veel categorieën:

  • Juistheid - verzamelt algemene bugs, bijv. oneindige lussen, ongepast gebruik van is gelijk aan (), enz
  • Slechte praktijk, b.v. behandeling van uitzonderingen, geopende streams, vergelijking van strings, enz
  • Prestatie, b.v. inactieve objecten
  • Multithreaded correctheid - verzamelt inconsistenties in synchronisatie en verschillende problemen in een omgeving met meerdere threads
  • Internationalisering - verzamelt problemen met betrekking tot codering en de internationalisering van applicaties
  • Kwetsbaarheid van schadelijke code - verzamelt kwetsbaarheden in code, bijv. codefragmenten die kunnen worden misbruikt door potentiële aanvallers
  • Veiligheid - verzamelt gaten in de beveiliging met betrekking tot specifieke protocollen of SQL-injecties
  • Dodgy - verzamelt code-geuren, b.v. nutteloze vergelijkingen, nulcontroles, ongebruikte variabelen, enz

Onder de Detector configuratie tabblad kunt u de regels controleren die u in uw project moet respecteren:

Het kenmerk snelheid geeft aan hoe duur de analyse zal zijn. De snelste de detector, de kleinste middelen die zijn verbruikt om het uit te voeren.

U kunt de volledige lijst met bugs die door FindBugs worden herkend vinden op het officiële documentatiepagina.

Onder de Filter bestanden paneel kunt u aangepaste bestandsfilters maken om delen van de codebasis op te nemen / uit te sluiten. Deze functie is handig - bijvoorbeeld - als u wilt voorkomen dat "onbeheerde" of "prullenbak" -code, defecten in de rapporten verschijnen of als u bijvoorbeeld alle klassen uit het testpakket wilt uitsluiten.

4. FindBugs IntelliJ IDEA-plug-in

4.1. Installatie

Als je een IntelliJ IDEA-fan bent en je wilt beginnen met het inspecteren van Java-code met FindBugs, dan kun je eenvoudig het plug-in-installatiepakket van de officiële JetBrains-site pakken en het uitpakken in de map% INSTALLATION_DIRECTORY% / plugins. Start uw IDE opnieuw op en u bent klaar om te gaan.

U kunt ook naar Instellingen -> Plug-ins navigeren en in alle opslagplaatsen zoeken naar de FindBugs-plug-in.

Op het moment dat dit artikel wordt geschreven, is versie 1.0.1 van de IntelliJ IDEA-plug-in net uit,

Om er zeker van te zijn dat de FindBugs-plug-in correct is geïnstalleerd, controleert u de optie met het label "Projectcode analyseren" onder Analyse -> FindBugs.

4.2. Rapporten browsen

Om statische analyse in IDEA te starten, klikt u op "Analyse projectcode", onder Analyse -> FindBugs, en zoekt u vervolgens naar het FindBugs-IDEA-paneel om de resultaten te inspecteren:

U kunt de tweede kolom met opdrachten aan de linkerkant van de schermafbeelding gebruiken om defecten te groeperen met behulp van verschillende factoren:

  1. Groepeer op een bugcategorie.
  2. Groepeer per klas.
  3. Groepeer op een pakket.
  4. Groepeer op een bugranglijst.

Het is ook mogelijk om de rapporten in XML / HTML-formaat te exporteren door op de knop "exporteren" in de vierde kolom met opdrachten te klikken.

4.3. Configuratie

De voorkeurenpagina's van de FindBugs-plug-in in IDEA spreken voor zich:

Dit instellingenvenster lijkt veel op het venster dat we in Eclipse hebben gezien, dus je kunt allerlei configuraties op een analoge manier uitvoeren, beginnend bij het analyse-inspanningsniveau, de rangschikking van bugs, het vertrouwen, het filteren van klassen, enz.

Het voorkeurenpaneel is toegankelijk binnen IDEA, door te klikken op het pictogram "Plugin-voorkeuren" onder het FindBugs-IDEA-paneel.

5. Rapportanalyse voor het Spring-Rest Project

In deze sectie gaan we wat licht werpen op een statische analyse die is uitgevoerd op het spring-rest-project dat beschikbaar is op Github als een voorbeeld:

De meeste defecten zijn klein - van zorg, maar laten we eens kijken wat we kunnen doen om een ​​aantal ervan op te lossen.

Methode negeert uitzonderlijke retourwaarde:

File fileServer = nieuw bestand (bestandsnaam); fileServer.createNewFile ();

Zoals je waarschijnlijk wel kunt raden, klaagt FindBugs over het feit dat we de geretourneerde waarde van de createNewFile () methode. Een mogelijke oplossing zou zijn om de geretourneerde waarde op te slaan in een nieuw gedeclareerde variabele en vervolgens iets zinvols te loggen met behulp van het DEBUG-logniveau - bijv. "Het genoemde bestand bestaat niet en is met succes gemaakt”Als de geretourneerde waarde waar is.

Bij uitzondering kan de methode de stream niet sluiten: dit specifieke defect illustreert een typisch gebruiksscenario voor het afhandelen van uitzonderingen dat suggereert sluit streams altijd in een Tenslotte blok:

probeer {DateFormat dateFormat = nieuwe SimpleDateFormat ("jjjj_MM_dd_HH.mm.ss"); String fileName = dateFormat.format (nieuwe datum ()); File fileServer = nieuw bestand (bestandsnaam); fileServer.createNewFile (); byte [] bytes = file.getBytes (); BufferedOutputStream stream = nieuwe BufferedOutputStream (nieuwe FileOutputStream (fileServer)); stream.write (bytes); stream.close (); retourneer "Je hebt succesvol geüpload" + gebruikersnaam; } catch (Uitzondering e) {return "Je hebt niet geüpload" + e.getMessage (); }

Wanneer een uitzondering wordt gegenereerd vóór de stream.close () instructie, de stream is nooit gesloten, daarom is het altijd beter om gebruik te maken van de Tenslotte{} blok om streams te sluiten die zijn geopend tijdens een proberen/vangst routine.

Een Uitzondering wordt betrapt wanneer Uitzondering wordt niet gegooid: Zoals u wellicht al weet, vangen Uitzondering is een slechte codeerpraktijk, FindBugs denkt dat u een zeer specifieke uitzondering moet opvangen, zodat u deze correct kunt afhandelen. Dus eigenlijk het manipuleren van streams in een Java-klasse, vangen IOException zou geschikter zijn dan een algemenere uitzondering te vangen.

Veld niet geïnitialiseerd in de constructor, maar er wordt niet naar verwezen zonder null-controle: het is altijd een goed idee om velden in constructors te initialiseren, anders moeten we leven met de mogelijkheid dat de code een NPE. Het wordt daarom aanbevolen om null-controles uit te voeren als we niet zeker weten of de variabele correct is geïnitialiseerd of niet.

6. Conclusie

In dit artikel hebben we de basissleutelpunten besproken om FindBugs in een Java-project te gebruiken en aan te passen.

Zoals u kunt zien, is FindBugs een krachtig, maar toch eenvoudig hulpmiddel voor statische analyse, het helpt om mogelijke kwaliteitslekken in uw systeem te detecteren - mits correct afgestemd en gebruikt.

Ten slotte is het vermeldenswaard dat FindBugs ook kan worden uitgevoerd als onderdeel van een afzonderlijk hulpprogramma voor continue automatische codebeoordeling, zoals Spoetnik, wat erg handig kan zijn om de rapporten veel meer zichtbaarheid te geven.

De voorbeeldcode die we hebben gebruikt voor statische analyse is beschikbaar op Github.