Οι προγραμματιστές του LLVM προτείνουν ασφαλή χειρισμό buffer στη C++

Λογότυπο LLVM

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

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

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

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

Στόχος μας είναι να βελτιώσουμε την ασφάλεια των κρίσιμων βάσεων κώδικα C++. Για αυτό σκοπεύουμε να δουλέψουμε σε δύο ιδέες.

Hardened C++ Standard Library
C++ Safe Buffer Προγραμματισμού Μοντέλο και Εργαλεία υιοθέτησης
Το Hardened libc++ προορίζεται να κάνει τις τυπικές διεπαφές βιβλιοθηκών C++ πιο ασφαλείς γενικά.

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

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

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

Αυτοί οι πρόσθετοι έλεγχοι χρόνου εκτέλεσης θα ομαδοποιηθούν σε διάφορες κατηγορίες που μπορούν να ελεγχθούν χωριστά. Η πρόθεση είναι ότι ένας προμηθευτής που στέλνει το libc++ στην πλατφόρμα του μπορεί να αποφασίσει ποιους ελέγχους θα ενεργοποιήσει στη βιβλιοθήκη αποστολής (εάν υπάρχει), ανάλογα με το επιθυμητό επίπεδο ασφάλειας.

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

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

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

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

Αναφέρεται επίσης ότι εξετάζουν το ενδεχόμενο ενός "clang static analyter checker" διαδρομή ευαίσθητη που προειδοποιεί εάν std::span κατασκευάζεται από ένα κοντέινερ που είναι μικρότερο από το μέγεθος που καθορίζεται στον κατασκευαστή του διαστήματος. Το εν λόγω πούλι είναι αυτόνομο και χρήσιμο από μόνο του, αν όλα πάνε καλά θα ενεργοποιηθεί από προεπιλογή για όλους τους χρήστες

Τελικά αν ενδιαφέρεστε να μάθετε περισσότερα γι 'αυτό, μπορείτε να ελέγξετε τις λεπτομέρειες στο παρακάτω σύνδεσμο.


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: AB Internet Networks 2008 SL
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.