Wednesday, July 25, 2007

FindBugs: Βρείτε Λάθη στον Java Κωδικά σας

Πριν από λίγες μέρες, αφού διάβασα αυτό το άρθρο, εγκατέστησα στο Netbeans και δοκίμασα το πρόγραμμα FindBugs. Μπορώ να πω ότι έμεινα εντυπωσιασμένος!

Το FindBugs είναι ένα πρόγραμμα που εξετάζει τα μεταγλωττισμένα αρχεία java (δηλαδή τα αρχεία με κατάληξη .class) ή τα JAR/WAR/EAR πακέτα του προγράμματός σας και συγκρίνει τα bytecodes με διάφορα bug patterns. Αν βρει κάποιο bug θα το επισημάνει με απόλυτη ακρίβεια στον κώδικά σας.

Αρχικά ήμουν επιφυλακτικός με το FindBugs αφού παρόμοια προγράμματα συνήθως εμφανίζουν ανύπαρκτα προβλήματα και στο τέλος ο προγραμματιστής τα αγνοεί τελείως. Αντιθέτως το FindBugs είναι πολύ εύστοχο στις επισημάνσεις του και (σχεδόν) όποιο λάθος βρει στον κώδικα είναι πραγματικό.
Άλλο ένα χαρακτηριστικό του FindBugs που με εντυπωσίασε είναι ότι εκτός από το αν βρίσκει τα λάθη, βρίσκει και τεχνικές κακού προγραμματισμού και τις επισημαίνει. Έτσι ο προγραμματιστής μπορεί να βελτιώσει αισθητά την απόδοση του προγράμματός του.

Το FindBugs εκτός του ότι μπορεί να εκτελεστεί ως plugin σε κάποια IDE (π.χ. Netbeans, Eclipse) εκτελείται εξίσου εύκολα και ως αυτόνομο πρόγραμμα. Αρκεί να ακολουθήσετε τα εξής απλά βήματα (για Windows XP):

1. Κατεβάστε το FindBugs κάπου στον υπολογιστή σας (π.χ. στο C:/Program Files) και αποσυμπιέστε το.

2. Επιλέξτε Start --> Run , πληκτρολογήστε cmd και πατήστε ΟΚ.

3. Πλοηγηθείτε στο φάκελο [φακελός του findbugs]/findbugs-1.2.1/bin. Για παράδειγμα αν το αποσυμπιέσατε στον C:/Program Files πρέπει να πλοηγηθείτε στον φάκελο C:/Program Files/findbugs-1.2.1/bin.

4. Εκτελέστε την εντολή findbugs.bat.
Εικόνα 1: Παράδειγμα εκτέλεσης του FindBugs από την γραμμή εντολών των Windows


Μόλις πατήσετε Enter θα εμφανιστεί το παράθυρο του FindBugs.

Εικόνα 2: Το παράθυρο του FindBugs μόλις ανοίγει το πρόγραμμα


6. Επιλέξτε File --> New Project. Ανοίγει ένα νέο παράθυρο όπου επιλέγουμε τα αρχεία που θέλουμε να ελέγξει το FindBugs.
  • Το πεδίο "Class archives and directories to analyze" είναι υποχρεωτικό να συμπληρωθεί αφού περιέχει τις μεταγλωττισμένες κλάσεις ή τα JAR/WAR/EAR πακέτα που θα ελεγχθούν για λάθη. Πατώντας το κουμπί Add καθορίζουμε ποίες κλάσεις ή πακέτα θα αναλυθούν.
  • Το πεδίο "Auxiliary class location" δεν είναι υποχρεωτικό να συμπληρωθεί αλλά αν συμπληρωθεί τα αποτελέσματα της ανάλυσης του κώδικα είναι πιο σωστά. Σε αυτό το πεδίο καθορίζουμε ποίες μεταγλωττισμένες κλάσεις ή πακέτα χρησιμοποιούνται από τον κώδικα (π.χ. σαν βιβλιοθήκες) που θέλουμε να αναλύσει το FindBugs αλλά δεν θέλουμε αυτές οι κλάσεις ή πακέτα να αναλυθούν.
  • Το πεδίο "Source Directories" περιέχει τα αρχεία πηγαίου κώδικα του προγράμματος.
Εικόνα 3: Επιλογή των αρχείων για έλεγχο

Αφού επιλέξουμε όλα τα αρχεία για ανάλυση πατάμε Finish και αυτόματα αρχίζει η ανάλυση των αρχείων.

7. Μόλις τελειώσει η ανάλυση εμφανίζεται η λίστα με όλα τα προβλήματα που βρήκε το FindBugs. Τα προβλήματα ομαδοποιούνται ανά κατηγορία. Κάνοντας διπλό κλικ σε ένα πρόβλημα το FindBugs επισημαίνει τη γραμμή του κώδικα όπου υπάρχει το πρόβλημα ενώ παρέχει και μια σύντομη περιγραφή του προβλήματος.

Εικόνα 4: Αναφορά σφαλμάτων που βρήκε το FindBugs στον Java κώδικα

Αφού διορθωθούν τα λάθη στον κώδικα (όσα κρίνει ο προγραμματιστής ότι πρέπει να διορθωθούν) ο κώδικας πρέπει να μεταγλωττιστεί ξανά πριν ελεγχθεί εκ νέου με το FindBugs. Είναι κάπως συνηθισμένο να διορθώνει κάποιος τα λάθη και να ξανά εκτελεί το FindBugs χωρίς να μεταγλωττίσει τον κώδικα. Έτσι εμφανίζονται πάλι τα ίδια λάθη χωρίς να καταλαβαίνει γιατί...

Η αξία της χρήσης του FindBugs φαίνεται κυρίως στα μεγάλα projects όπου δουλεύουν μαζί πολλοί προγραμματιστές και είναι δύσκολο κάποιος senior developer να ελέγξει γραμμή προς γραμμή τον κώδικα. Από την προσωπική μου εμπειρία έχω διαπιστώσει το πόσα πολλά bugs μπορούν να βρεθούν σε κώδικα όπου έχουν κατασκευάσει πολλοί προγραμματιστές (πολλοί εξ' αυτών juniors :-) ).

Σε επόμενα posts θα αναφερθώ πιο πολύ στο FindBugs. Μέχρι τότε δεν χάνετε τίποτα να δοκιμάσετε τις ικανότητες του.


1 comment:

Anonymous said...

Το findbugs είναι εδώ και καιρό μέρος του development process στα projects μου.

keep it up