Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεKarissa Mula Τροποποιήθηκε πριν 10 χρόνια
1
Ανάλυση του έργου Platform Independent Petri-net Editor 2.5 (PIPE2)
FindBugs & PMD Ανάλυση του έργου Platform Independent Petri-net Editor 2.5 (PIPE2) Μάθημα: Ερευνητικά Θέματα Ανάπτυξης Λογισμικού Αθανασόπουλος Μιχάλης, ΣΗΜΜΥ ΕΜΠ, 2009
2
Platform Independent Petri-net Editor 2.5 (GUI view)
3
PIPE2, ορισμένα στοιχεία
Εργαλείο σχεδιασμού και ανάλυσης Δικτύων Petri Έχει αναπτυχθεί και εξελίσσεται κυρίως από ερευνητές & μεταπτυχιακούς φοιτητές του Imperial College (από το 2002) Metrics: 26716 LOC (χωρίς σχόλια/κενές γραμμές) 29 packages, 243 κλάσεις, 1820 μέθοδοι Ενδιαφέρον γιατί: Επιστημονικό λογισμικό, περίπλοκοι αλγόριθμοι, προγραμματιστές από το ακαδημαϊκό περιβάλλον (κατά κανόνα CS) Σημαντικός αριθμός προγραμματιστών στην πορεία των χρόνων (24 σύμφωνα με το site) για το μέγεθος του έργου Σχετικά επιτυχημένο εργαλείο που έχει υιοθετηθεί και χρησιμοποιείται αρκετά (παρέχει υποδομή για εύκολες επεκτάσεις) Site:
4
FindBugs, ορισμένα στοιχεία
Ένα από τα πιο δημοφιλή εργαλεία στατικής ανάλυσης για έργα λογισμικού υλοποιημένα σε Java > downloads (Ιούλιος 2008) Ανοιχτού κώδικα (Lesser GNU Public License) Φορείς: U of Maryland, Υποστηρικτές: SureLogic, Google, Sun Microsystems, National Science Foundation των ΗΠΑ Αναλύει στατικά Java bytecode έναντι ενός συνόλου προτύπων σφαλμάτων Σύμφωνα με το site, το ποσοστό των false warnings που δίνει είναι μικρότερο από 50% Site: Διατίθεται και ως plug-in για το Eclipse.
5
PMD, ορισμένα στοιχεία Εργαλείο στατικής ανάλυσης για λογισμικό γραμμένο σε Java (επίσης, αρκετά διαδεδομένο) Ανοιχτού κώδικα (υπό ενός "BSD-style" license) Ανεξάρτητη κοινότητα ανάπτυξης, Υποστηρικτές: DARPA, ae.be, QA-Systems κ.ά. Εξετάζει κώδικα Java αναζητώντας παραβιάσεις (violations) έναντι ενός συνόλου κανόνων και πιο συγκεκριμένα: πιθανά σφάλματα, «νεκρό» κώδικα, μη βέλτιστο κώδικα και υπερβολικά σύνθετες εκφράσεις Περιλαμβάνει επίσης εργαλείο εντοπισμού κλώνων μέσω string matching (αλγόριθμος Karp-Rabin) Site: Διατίθενται plug-ins για πολλά IDEs.
6
FindBugs: ενσωμάτωση & χρήση
Εγκατάσταση ως Eclipse plug-in (υπάρχει αντίστοιχο update site) Στο Eclipse προστίθεται το FindBugs Perspective και τα Views: Bug Explorer: Δένδρο πλοήγησης σφαλμάτων (σημαντικές δυνατότητες ομαδοποίησης & φιλτραρίσματος) Bug User Annotations: Ο χρήστης μπορεί να κατηγοριοποιήσει και να προσθέσει επισημάνσεις για κάθε bug Η περιγραφή κάθε bug παρατίθεται στο Properties View. Η εφαρμογή της ανάλυσης γίνεται στο σύνολο του project. Δεν απαιτείται επέμβαση στον κώδικα (π.χ. annotations) ή γενικότερα περαιτέρω ενέργειες από τον χρήστη (πέρα ενδεχομένως από ρυθμίσεις των παραμέτρων της ανάλυσης)
7
FindBugs: παράμετροι Δυνατότητα για project specific / workspace ρυθμίσεις Ανάλυση Επίπεδο «προσπάθειας ανάλυσης»: minimum, default, maximum. Επιλέχθηκε το maximum. Επιλογή των bug detectors που θα χρησιμοποιηθούν. Επιλέχθηκαν όλοι οι διαθέσιμοι Κάθε bug detector αντιστοιχεί σε ένα σύνολο προτύπων σφαλμάτων (bug patterns) συχνά διαφορετικής προτεραιότητας & κατηγορίας. Αναφορά Επίπεδο προτεραιότητας: Low, Normal, High. Επιλέχθηκε Low. Κατηγορία: Malicious code vulnerability, Dodgy, Bad practice, Correctness, Internationalization, Performance, Security, Multithreaded correctness, Experimental, Bogus random noise. Επιλέχθηκαν όλες. Αρχεία φίλτρων (include/exclude φίλτρα). Δεν χρησιμοποιήθηκαν.
8
FindBugs: ανάλυση Χρόνος: 3 λεπτά (για τις συγκεκριμένες επιλογές).
Με τις “out of the box” ρυθμίσεις, περίπου 50’’. Υπολογιστής: 1.6 GHz (Intel Core Duo), 1 GB RAM. Αποτελέσματα: 855 Ανά προτεραιότητα: High (43), Normal (330), Low (482) Ανά κατηγορία: Malicious code vulnerability (40), Dodgy (295), Bad practice (99), Correctness (64), Internationalization (7), Performance (308), Security (0), Multithreaded correctness (4), Experimental (1), Bogus random noise (37)
9
FindBugs: παραδείγματα
StateSpace.java: Nullcheck of sourceDataLayer at line 83 of value previously dereferenced DataLayer sourceDataLayer = sourceFilePanel.getDataLayer(); int[] markup = sourceDataLayer.getCurrentMarkingVector(); if (sourceDataLayer == null) { JOptionPane.showMessageDialog( null, "Please, choose a source net", "Error", JOptionPane.ERROR_MESSAGE); return; } StateSpaceGenerator.java: Remainder of hashCode could be negative LinkedList hashrow = es[newstate.hashCode()%NUMHASHROWS]; Transition.java: Test for floating point equality public int compareTo(Object arg0) { double angle2 = ((ArcAngleCompare)arg0).angle; return (angle < angle2 ? -1 : (angle == angle2 ? 0 : 1)); Επεξήγηση: Η μέθοδος hashCode() του Object θα μπορούσε να επιστρέψει αρνητική τιμή. Στην προκειμένη περίπτωση όμως η hashCode() γίνεται override στην κλάση State (που είναι και ο τύπος του newstate). Επεξήγηση: ο έλεγχος αν έχει επιστραφεί null από την μέθοδο getDataLayer() (η οποία όντως ενδέχεται να επιστρέψει null) γίνεται αφού γίνει dereference το sourceDataLayer. Επεξήγηση: Η χρήση του == operator μεταξύ float/double μεταβλητών είναι αμφιλεγόμενη πρακτική. Εναλλακτικά προτείνεται μια σύγκριση όπως η εξής: Math.abs(x - y) < )
10
PMD: ενσωμάτωση & χρήση
Εγκατάσταση ως Eclipse plug-in (υπάρχει, επίσης, αντίστοιχο update site) Στο Eclipse προστίθεται το PMD Perspective και τα Views: Violations Outline: Δένδρο πλοήγησης παραβιάσεων Violations Overview: Παραβιάσεις ανά κλάση Επίσης: CPD View (για το εργαλείο εντοπισμού κλώνων) και Dataflow View Η εφαρμογή της ανάλυσης γίνεται στο σύνολο του project. Και πάλι, δεν απαιτείται επέμβαση στον κώδικα ή περαιτέρω ενέργειες από το χρήστη (εκτός ίσως από ρυθμίσεις των παραμέτρων της ανάλυσης)
11
PMD: παράμετροι Δυνατότητα ρυθμίσεων ανά “working set” Ανάλυση Αναφορά
Επιλογή των κανόνων έναντι των οποίων ο κώδικας θα ελεγχθεί για παραβιάσεις. Επιλέχθηκαν όλοι οι διαθέσιμοι. Συγκεκριμένα, στο PMD υπάρχουν «σύνολα κανόνων» (rule sets) τα οποία περιλαμβάνουν κανόνες παρόμοιων χαρακτηριστικών και διαφόρων επιπέδων προτεραιότητας. Κατά συνέπεια, οι παραβιάσεις που εντοπίζονται έχουν νόημα εφόσον ο κανόνας που επιλέγεται έχει νόημα για το project. Αναφορά Οι παραβιάσεις οργανώνονται ανά package και κλάση. Επιλέγονται τα επίπεδα προτεραιότητας που εμφανίζονται, τα οποία είναι: [1] error high, [2] error, [3] warning high, [4] warning, [5] information Δυνατότητα υπολογισμού στατιστικών στοιχείων (# Violations, #Violations / LOC, #Violations / Method)
12
PMD: ανάλυση Χρόνος: 40’’ (για τις συγκεκριμένες επιλογές)
Σύνολο παραβιάσεων: 5932 [1] error high: 182 [2] error: 182 [3] warning high: 4325 [4] warning: 81 [5] information: 1162 Στην εξέταση των αποτελεσμάτων λήφθηκαν υπόψη παραβιάσεις κυρίως από τα επίπεδα [1] και [2].
13
PMD: παραδείγματα ArcPathPoint.java: Overridable method ‘setPointLocation’ called during object construction public ArcPathPoint(ArcPath a) { this(); myArcPath = a; setPointLocation(0,0); } ArcHandler.java: A switch with less than 3 branches is inefficient, use a if statement instead. public void mouseDragged(MouseEvent e) { switch (CreateGui.getApp().getMode()) { case Pipe.SELECT: if (!isDragging){ break; } Arc currentObject = (Arc)myObject; Point oldLocation = currentObject.getLocation(); … PNMatrix.java: Avoid reassigning parameters such as 'a' private int gcd2(int a, int b) { int gcd; a = Math.abs(a); b = Math.abs(b); Επεξήγηση από το PMD: «Calling overridable methods during construction poses a risk of invoking methods on an incompletely constructed object and can be difficult to discern. It may leave the sub-class unable to construct its superclass or forced to replicate the construction process completely within itself, losing the ability to call super(). If the default constructor contains a call to an overridable method, the subclass may be completely uninstantiable. Note that this includes method calls throughout the control flow graph - i.e., if a constructor Foo() calls a private method bar() that calls a public method buz(), this denotes a problem.»
14
Σύγκριση Συγκριτική αξιολόγηση σε τρείς άξονες:
Ενσωμάτωση και χρήση σε περιβάλλον ανάπτυξης και χαρακτηριστικά διεπαφής με το χρήστη: Ισοδύναμα. Δυνατότητες ανάλυσης, χρησιμοποιούμενες τεχνικές: Διαφορετικό επίπεδο ανάλυσης και –ενδεχομένως- στόχοι. Το PMD εντοπίζει «παραβιάσεις» σε κανόνες που επιλέγει ή θέτει ο χρήστης ενώ το FindBugs προσπαθεί να εντοπίσει σφάλματα που ενδεχομένως να οδηγήσουν σε λανθασμένη ή κακή λειτουργία. Πλήθος, ποιότητα κι ευστοχία αποτελεσμάτων: Τα αποτελέσματα του FindBugs έχουν συνήθως μεγαλύτερο ενδιαφέρον και είναι συνήθως πιο κρίσιμα ως προς την ορθή λειτουργία του συστήματος.
15
Συμπεράσματα Χαμηλές απαιτήσεις σε χρόνο και υποδομή για την εφαρμογή της ανάλυσης – γεγονός που επιτρέπει την επαναλαμβανόμενη εφαρμογή. Μικρή προσπάθεια από το χρήστη για την εφαρμογή της ανάλυσης. Σημαντική προσπάθεια για την διερεύνηση των γενικά πολλών και συχνά άστοχων αποτελεσμάτων. Επαναληπτική διαδικασία: επιλογή ρυθμίσεων -> ανάλυση -> διερεύνηση -> χαρακτηρισμός / διόρθωση -> αναθεώρηση ρυθμίσεων -> ανάλυση κ.ο.κ.
16
Ευχαριστώ αναφορά & παρουσίαση:
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.