Το έργο LLVM αναπτύσσει ασφαλή χειρισμό buffer σε C++

Οι προγραμματιστές του έργου LLVM έχουν προτείνει έναν αριθμό αλλαγών με στόχο την ενίσχυση της ασφάλειας των κρίσιμων για την αποστολή έργων C++ και την παροχή ενός μέσου για την εξάλειψη σφαλμάτων που προκαλούνται από υπερβάσεις buffer. Η εργασία επικεντρώνεται σε δύο τομείς: την παροχή ενός μοντέλου ανάπτυξης που σας επιτρέπει να εργάζεστε με ασφάλεια με buffer και την εργασία για την ενίσχυση της ασφάλειας της τυπικής βιβλιοθήκης λειτουργιών libc++.

Το προτεινόμενο μοντέλο ασφαλούς προγραμματισμού για την C++ είναι η χρήση των κλάσεων που παρέχονται από την τυπική βιβλιοθήκη όταν εργάζεστε με buffer αντί να χειρίζεστε γυμνούς δείκτες. Για παράδειγμα, προτείνεται η χρήση των κλάσεων std::array, std::vector και std::span, οι οποίες θα προστεθούν με έλεγχο χρόνου εκτέλεσης για εκχωρημένη μνήμη εκτός ορίων.

Για την καταπολέμηση των επικίνδυνων πρακτικών προγραμματισμού στο clang, προτείνεται η έκδοση προειδοποιήσεων μεταγλωττιστή για όλες τις αριθμητικές λειτουργίες δείκτη, παρόμοιες με τις προειδοποιήσεις του clang-tidy κατά τη χρήση της σημαίας "cppcoreguidelines-pro-bounds-pointer-arithmetic", η υποστήριξη για την οποία θα εμφανίζεται στο η έκδοση LLVM 16. Για να ενεργοποιηθούν τέτοιες προειδοποιήσεις, θα προστεθεί μια ξεχωριστή σημαία στο clang, η οποία δεν είναι ενεργή από προεπιλογή.

Σχεδιάζεται να εφαρμοστεί μια προαιρετική λειτουργία σκληρυμένης προστασίας στο libc++, η οποία, όταν ενεργοποιηθεί, θα συλλάβει ορισμένες καταστάσεις που οδηγούν σε απροσδιόριστη συμπεριφορά κατά το χρόνο εκτέλεσης. Για παράδειγμα, στις κλάσεις std::span και std::vector, θα παρακολουθείται μια πρόσβαση εκτός ορίων, οπότε το πρόγραμμα θα διακοπεί. Οι προγραμματιστές πιστεύουν ότι η προσθήκη τέτοιων αλλαγών θα διατηρήσει το libc++ συμβατό με τα πρότυπα C++, καθώς η επιλογή του τρόπου χειρισμού περιπτώσεων απροσδιόριστης συμπεριφοράς ανήκει στους προγραμματιστές της βιβλιοθήκης, οι οποίοι μπορεί, μεταξύ άλλων, να ερμηνεύσουν την απροσδιόριστη συμπεριφορά ως σφάλμα που απαιτεί πρόγραμμα για έξοδο.

Οι έλεγχοι χρόνου εκτέλεσης στο libc++ σχεδιάζονται να χωριστούν σε κατηγορίες που μπορούν να συμπεριληφθούν μεμονωμένα. Ορισμένοι από τους προτεινόμενους ελέγχους που δεν οδηγούν σε πιο σύνθετες λειτουργίες ή αλλαγές ABI έχουν ήδη εφαρμοστεί στην ασφαλή λειτουργία του libc++.

Επιπλέον, σχεδιάζεται η προετοιμασία μιας εργαλειοθήκης για τη διόρθωση του κώδικα, που θα σας επιτρέπει να αντικαταστήσετε μεταβλητές με γυμνούς δείκτες σε κοντέινερ και να εφαρμόσετε εναλλακτικούς χειριστές σε περιπτώσεις όπου το κοντέινερ δεν μπορεί να αντικαταστήσει απευθείας τον δείκτη (για παράδειγμα, το "if (array_pointer)" Η κατασκευή μπορεί να μετατραπεί σε "if (span.data ()"). Οι προσαρμογές μπορούν να εφαρμοστούν όχι μόνο σε τοπικές μεταβλητές, αλλά και σε παραμέτρους τύπου με δείκτες.

Πηγή: opennet.ru

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