Η Intel άνοιξε τον κώδικα του συστήματος μηχανικής εκμάθησης ControlFlag για να εντοπίσει σφάλματα στον κώδικα

Η Intel ανακάλυψε εξελίξεις που σχετίζονται με το ερευνητικό έργο ControlFlag, με στόχο τη δημιουργία ενός συστήματος μηχανικής εκμάθησης για τη βελτίωση της ποιότητας του κώδικα. Η εργαλειοθήκη που εκπονήθηκε από το έργο επιτρέπει, με βάση ένα μοντέλο εκπαιδευμένο σε μεγάλο αριθμό υπάρχοντος κώδικα, να ανιχνεύει διάφορα λάθη και ανωμαλίες σε κείμενα πηγής γραμμένα σε γλώσσες υψηλού επιπέδου όπως η C/C++. Το σύστημα είναι κατάλληλο για τον εντοπισμό διαφόρων ειδών προβλημάτων στον κώδικα, από τον εντοπισμό τυπογραφικών σφαλμάτων και λανθασμένους συνδυασμούς τύπων έως τον εντοπισμό χαμένων ελέγχων NULL σε δείκτες και προβλήματα μνήμης. Ο κώδικας ControlFlag είναι γραμμένος σε C++ και είναι ανοιχτού κώδικα υπό την άδεια MIT.

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

Ο κώδικας που ελέγχεται διέρχεται από μια παρόμοια διαδικασία αναγνώρισης μοτίβων που ελέγχονται σε ένα δέντρο απόφασης αναφοράς. Μεγάλες αποκλίσεις με γειτονικούς κλάδους υποδηλώνουν την παρουσία μιας ανωμαλίας στο δοκιμασμένο πρότυπο. Το σύστημα επιτρέπει επίσης όχι μόνο να εντοπίσει ένα σφάλμα στο πρότυπο, αλλά και να προτείνει μια διόρθωση. Για παράδειγμα, στον κώδικα OpenSSL, βρέθηκε η κατασκευή "(s1 == NULL) ∧ (s2 == NULL)", η οποία εμφανίστηκε μόνο 8 φορές στο δέντρο σύνταξης, ενώ ο πλησιέστερος κλάδος με την τιμή "(s1 == NULL) || (s2 == NULL)" εμφανίστηκε περίπου 7 χιλιάδες φορές. Το σύστημα εντόπισε επίσης μια ανωμαλία «(s1 == NULL) | (s2 == NULL)" που εμφανίστηκε 32 φορές στο δέντρο.

Η Intel άνοιξε τον κώδικα του συστήματος μηχανικής εκμάθησης ControlFlag για να εντοπίσει σφάλματα στον κώδικα

Κατά την ανάλυση του αποσπάσματος κώδικα "if (x = 7) y = x;" το σύστημα έχει καθορίσει ότι η κατασκευή «μεταβλητή == αριθμός» χρησιμοποιείται συνήθως στην πρόταση «αν» για τη σύγκριση αριθμητικών τιμών, επομένως, με μεγάλη πιθανότητα, η ένδειξη «μεταβλητή = αριθμός» στην έκφραση «αν» προκαλείται από ένα τυπογραφικό λάθος. Οι παραδοσιακοί στατικοί αναλυτές θα έπιαναν επίσης ένα τέτοιο σφάλμα, αλλά σε αντίθεση με αυτούς, το ControlFlag δεν χρησιμοποιεί έτοιμους κανόνες στους οποίους είναι δύσκολο να προβλεφθούν όλες οι πιθανές επιλογές, αλλά βασίζεται στα στατιστικά στοιχεία της χρήσης όλων των ειδών κατασκευών σε μεγάλο αριθμό έργα.

Ως πείραμα, χρησιμοποιώντας το ControlFlag στον πηγαίο κώδικα του βοηθητικού προγράμματος cURL, το οποίο αναφέρεται συχνά ως παράδειγμα υψηλής ποιότητας και επαληθευμένου κώδικα, εντοπίστηκε ένα σφάλμα απαρατήρητο από τους στατικούς αναλυτές κατά τη χρήση του στοιχείου δομής "s->keepon". που είχε έναν αριθμητικό τύπο, αλλά συγκρίθηκε με τη δυαδική τιμή TRUE . Στον κώδικα OpenSSL, εκτός από το παραπάνω πρόβλημα με "(s1 == NULL) ∧ (s2 == NULL)", υπήρχαν επίσης ανωμαλίες στις εκφράσεις "(-2 == rv)" (το μείον ήταν τυπογραφικό λάθος ) και "BIO_puts(bp, ":")

Πηγή: opennet.ru

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