Κάντε στατική ανάλυση με το PVS-Studio

Το PVS-studio είναι ένας στατικός αναλυτής κώδικα για C,C++,C# και Java. Έχω εντυπωσιαστεί με τα προβλήματα που κατά καιρούς βρίσκει και διορθώνει σε προγράμματα ανοικτού κώδικα, που κάποιες φορές έχουν περάσει απαρατήρητα για δεκαετίες.

Δεν είναι ελεύθερο λογισμικό. Όσο για την τιμή του, δεν τολμώ καν να ρωτήσω καν πόσο κάνει, μιας και το αγοραστικό του κοινό είναι πολύ μεγάλες εταιρίες. Ευτυχώς η εταιρία που το κατασκευάζει το διαθέτει δωρεάν, ακόμα και για μικρούς ανεξάρτητους προγραμματιστές. Το μόνο που πρέπει να κάνεις, είναι να προσθέσεις ένα σχόλιο στην αρχή κάθε πηγαίου αρχείου.

Υπάρχει και ένα πρόγραμμα που το κάνει αυτό αυτόματα, αλλά υπάρχει και το παλιό καλό sed.

find src test -name "*.cpp"  | xargs sed -i "1i// This is an open source non-commercial project. Dear PVS-Studio, please check it.\n// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com"

Οι γραμμές μπορούν να αφαιρεθούν με ένα sed -i "1,2d", αλλά αυτό μπορείς να το κάνεις νόμιμα μόνο μια φορά. Αν το βρείς χρήσιμο, θα πρέπει να αφήσεις τα σχόλια εκεί και να μπούν και στο αποθετήριο.

Εγκατάσταση και χρήση

Κατεβάζουμε το πρόγραμμα από εδώ PVS-Studio download.

  • Αν χρησιμοποιούμε το cmake θα πρέπει να ενεργοποιήσουμε το compiling database με - -DCMAKE_EXPORT_COMPILE_COMMANDS=On ή με set(CMAKE_EXPORT_COMPILE_COMMANDS ON) μέσα στο CMakeLists.txt

  • Στην γενική περίπτωση (πχ με το make) θα φτιάξει την βάση με την βοήθεια του strace. Το build θα πρέπει να κάνει compile όλα τα αρχεία

pvs-studio-analyzer trace -- make debug -j8

Ανάλυση και αναφορές

Πρώτα θα κάνουμε την ανάλυση και μετά θα εξετάσουμε τα αρχεία καταγραφής. Η εντολή plog-converter θα τα μετατρέψει σε κάτι κατάλληλο για χρήση από την μηχανή ή από ένα προγραμματιστή.

pvs-studio-analyzer analyze -j2  -o PVS-Studio.log

mkdir -p pvs_report
plog-converter -a GA:1,2 -t fullhtml -o pvs_report PVS-Studio.log
xdg-open pvs_report/fullhtml/index.html

Για περισσότερα δες PVS-Studio manual. Και αν βρήκες κάποιο καλά κρυμμένο πρόβλημα στον κώδικα σου, πες πας την ιστορία σου. :smirk: