Ανεξάρτητη κριτική του PVS-Studio (Linux, C++)

Είδα μια δημοσίευση που η PVS είχε μάθει να αναλύει στο Linux και αποφάσισα να τη δοκιμάσω στα δικά μου έργα. Και αυτό είναι που βγήκε από αυτό.


περιεχόμενο

  1. Πλεονεκτήματα
  2. Μειονεκτήματα
  3. Αποτελέσματα της
  4. Επίλογος

Πλεονεκτήματα

Υποστήριξη απόκρισης

Ζήτησα ένα δοκιμαστικό κλειδί και μου το έστειλαν την ίδια μέρα.

Αρκετά σαφή τεκμηρίωση

Καταφέραμε να εκκινήσουμε τον αναλυτή χωρίς κανένα πρόβλημα. Βοήθεια για εντολές κονσόλας είναι επίσης διαθέσιμη (αν και υπάρχουν κάποια παράπονα εδώ, δείτε την ενότητα Μειονεκτήματα).

Δυνατότητα πολυνηματικής ανάλυσης

Ο αναλυτής έχει μια "τυπική" επιλογή -j, επιτρέποντας την ανάλυση να εκτελείται παράλληλα σε πολλές εργασίες. Αυτό εξοικονομεί πολύ χρόνο.

Καλή οπτικοποίηση

Πολλές διαφορετικές μορφές εξόδου, από κείμενο έως ένα μικρό ρύγχος ιστού. Η διεπαφή ιστού είναι βολική, συνοπτική, με υποδείξεις δίπλα σε γραμμές στον κώδικα και συνδέσμους σε διαγνωστικές περιγραφές.

Εύκολη ενσωμάτωση στη συναρμολόγηση

Όλη η τεκμηρίωση βρίσκεται στον ιστότοπό τους, μπορώ μόνο να πω ότι εάν το έργο σας έχει κατασκευαστεί χρησιμοποιώντας το CMake, τότε όλα είναι πολύ απλά.

Καλές διαγνωστικές περιγραφές

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

Μειονεκτήματα

Άγνοια της γλώσσας C++ από τον αναλυτή

Δυστυχώς, το PVS μερικές φορές κάνει συντακτικά λάθη και δημιουργεί ψευδώς θετικά μηνύματα όταν ο κώδικας είναι απολύτως σωστός.

Για παράδειγμα, υπάρχει μια συνάρτηση που επιστρέφει void:

template <typename T>
auto copy (const void * source, void * destination)
    ->
        std::enable_if_t
        <
            std::is_copy_constructible<T>::value
        >
{
    new (destination) T(*static_cast<const T *>(source));
}

Ναι, λέξη-κλειδί auto Μπορεί να σημαίνει void, γι' αυτό είναι αυτόματη. Αλλά το PVS παρήγαγε τα ακόλουθα μηνύματα:

dynamic_tuple_management.hpp:29:1: error: V591 Non-void function should return a value.
dynamic_tuple_management.hpp:29:1: error: V2542 Function with a non-void return type should return a value from all exit paths.

Πολύ αργό site

Ναι, στη διεπαφή ιστού δίπλα σε κάθε μήνυμα υπάρχει ένας σύνδεσμος για την αντίστοιχη διαγνωστική περιγραφή με παραδείγματα. Αλλά όταν κάνετε κλικ σε έναν σύνδεσμο, πρέπει να περιμένετε πολύ καιρό, και μερικές φορές συμβαίνει Χρόνος εξόδου της πύλης 504.

Γλώσσα

Όλες οι περιγραφές είναι στα ρωσικά, το οποίο είναι υπέροχο. Αλλά οι σύνδεσμοι από την αναφορά οδηγούν πάντα στην αγγλική έκδοση. Θα ήταν ωραίο να μπορείτε να αλλάζετε τη γλώσσα, ώστε να μπορείτε να βλέπετε αμέσως τα διαγνωστικά στα Ρωσικά. Δεν βρήκα τέτοια επιλογή στη διεπαφή.

Δεν είναι βολικό να εργάζεστε με διαγνωστικά επίπεδα μέσω της κονσόλας

Ας ξεκινήσουμε με το γεγονός ότι οι δύο εντολές που χρησιμοποιήθηκαν (αυτό pvs-studio-analyzer и plog-converter) διαφορετικές μορφές για τον καθορισμό διαγνωστικών.

Βοήθεια για pvs-studio-analyzer διαβάζει:

-a [MODE], --analysis-mode [MODE]
    MODE defines the type of warnings:
    1 - 64-bit errors;
    2 - reserved;
    4 - General Analysis;
    8 - Micro-optimizations;
    16 - Customers Specific Requests;
    32 - MISRA.
    Modes can be combined by adding the values
    Default: 4

Πέρασα πολύ καιρό προσπαθώντας να καταλάβω πού να πάω προσθέστε ("προσθήκη των τιμών") πλήκτρα. Προσπάθησα να τα παραθέσω χωρισμένα με κόμματα:

pvs-studio-analyzer analyze ... -a 1,4,16

Προσπάθησα να καταχωρήσω το κλειδί αρκετές φορές:

pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16

Και μόνο τότε κατάλαβα ότι επρόκειτο για μάσκες! Και χρειάζεσαι συνοψίζωαλλά όχι προσθέστε νοήματα. Για παράδειγμα, για να λάβετε γενικά διαγνωστικά, διαγνωστικά για μικροβελτιστοποιήσεις και MISRA, πρέπει να τα συνοψίσετε (4 + 8 + 32 = 44):

pvs-studio-analyzer analyze ... -a 44

Η χρήση bitmasks σε διεπαφές χρήστη είναι γενικά κακή μορφή. Όλα αυτά θα μπορούσαν να συνοψιστούν εσωτερικά και να οριστεί ένα σύνολο σημαιών για τον χρήστη.

Επιπλέον, υπάρχει επίσης ένα βοηθητικό πρόγραμμα plog-converter, το οποίο δημιουργεί πληροφορίες στατικής ανάλυσης αναγνώσιμες από τον άνθρωπο. Έχει άλλα προβλήματα.

Βοήθεια για το πρόγραμμα plog-converter Αναφορές:

-a, --analyzer            Specifies analyzer(s) and level(s) to be
                          used for filtering, i.e.
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Default: GA:1,2

Κάποια "επίπεδα" εμφανίστηκαν εδώ που δεν υπήρχαν πριν και δεν βρήκα τίποτα γι' αυτά στην τεκμηρίωση.

Γενικά, δεν είναι ξεκάθαρο. Γι' αυτό έβαλα τα πάντα στο μέγιστο.

Ένα σωρό ηλίθιες βρισιές στο Catch

Δύο από τα τρία έργα που ανέλυσα χρησιμοποιούν μια βιβλιοθήκη δοκιμών μονάδων Catch2. Και η μερίδα του λέοντος των μηνυμάτων (!!! 90 από 138 στο ένα και 297 από 344 στο άλλο!!!) έχουν την εξής μορφή:

Ανεξάρτητη κριτική του PVS-Studio (Linux, C++)

Δεν λαμβάνει υπόψη το multithreading

Υπάρχουν πολλά ψευδώς θετικά στοιχεία σχετικά με τις υποτιθέμενες αμετάβλητες μεταβλητές ή τους ατελείωτους βρόχους, ενώ η εργασία με αυτές τις μεταβλητές γίνεται από διαφορετικά νήματα, και αν δεν ήταν έτσι, τότε οι δοκιμές μονάδας δεν θα λειτουργούσαν.

Ανεξάρτητη κριτική του PVS-Studio (Linux, C++)

Ωστόσο, μπορεί ένας στατικός αναλυτής να το λάβει αυτό υπόψη; Δεν ξέρω.

Αποτελέσματα της

Το PVS δεν βρήκε πραγματικά σφάλματα στα έργα ανοιχτού κώδικα μου Έκρηξη и Proxima, καθώς και σε προσχέδιο εργασίας, το οποίο για ευνόητους λόγους δεν μπορώ να παρουσιάσω. Είναι αλήθεια ότι αξίζει να έχετε κατά νου ότι ορισμένες ελλείψεις έχουν ήδη εντοπιστεί και διορθωθεί νωρίτερα χρησιμοποιώντας Cppcheck и scan-build.

Σε γενικές γραμμές, η εντύπωση από όλους αυτούς τους αναλυτές είναι περίπου η ίδια: ναι, πιάνουν κάτι, μερικές φορές ακόμη και κάτι σημαντικό, αλλά συνολικά ο μεταγλωττιστής είναι αρκετός.

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

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

Αξιοποιήστε στο έπακρο τα διαγνωστικά μεταγλωττιστή

Η ομάδα μας χρησιμοποιεί (και σας συμβουλεύει) τις ακόλουθες επιλογές συλλογής:

-Werror

-Wall
-Wextra
-Wpedantic

-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo

Ενεργοποιήστε τα στο έργο σας και μάθετε πολλά για τον κώδικά σας.

Επιμείνετε στο πρότυπο

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

Επιμείνετε στην τυπική σημασιολογία λειτουργίας

Η πρόσθεση πρέπει να είναι πρόσθεση, ο πολλαπλασιασμός πρέπει να είναι πολλαπλασιασμός, η κλήση συνάρτησης πρέπει να είναι κλήση συνάρτησης, η αντιγραφή πρέπει να είναι αντιγραφή, η μεταφορά πρέπει να είναι μεταφορά, το κοντέινερ πρέπει να είναι επαναλαμβανόμενο, ο επαναλήπτης πρέπει να έχει προώθηση ++ και αποαναφορά *. Και ούτω καθεξής και ούτω καθεξής.

Νομίζω ότι η ιδέα είναι ξεκάθαρη. Υπάρχουν καθιερωμένες συμβάσεις που δεν είναι δεσμευτικές, αλλά όλοι οι χρήστες και οι αναγνώστες του κώδικά σας περιμένουν να δουν. Μην προσπαθείς να ξεγελάσεις τους άλλους, αλλιώς θα ξεγελάσεις τον εαυτό σου.

Γράψτε συμβατό κώδικα

Πρώτα απ 'όλα, εννοώ την τυπική βιβλιοθήκη. Είναι πολύ επιθυμητό οι διεπαφές των κλάσεων και των λειτουργιών σας να μπορούν να χρησιμοποιηθούν με τυπικές και άλλες βιβλιοθήκες (για παράδειγμα, Boost).

Μη διστάσετε να ρίξετε μια ματιά στις διεπαφές STL και Boost. Με σπάνιες εξαιρέσεις, εκεί θα δεις ένα άξιο πρότυπο.

Αξιοποιήστε στο έπακρο τα εργαλεία ανοιχτού κώδικα

Για την ίδια στατική ανάλυση, υπάρχουν τουλάχιστον δύο ανοιχτά δωρεάν εργαλεία που μπορούν να συνδεθούν μόνο μία φορά σε οποιοδήποτε έργο με το σύστημα κατασκευής CMake.

Μπορείτε να διαβάσετε περισσότερα για αυτό στην πρόσφατη δημοσίευσή μου.

Επίλογος

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

Αυτό είναι απλώς μια συνέπεια. Πρέπει να αναζητήσουμε και να εξαλείψουμε την αιτία.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο