Για το Linux 5.18 σχεδιάζεται να μετακινηθεί ο κώδικας σε μια πιο πρόσφατη έκδοση του C προκειμένου να λυθούν διάφορα προβλήματα. 

Τι είναι το Linux και σε τι χρησιμεύει;

Κατά τη διαδικασία του συζήτηση προγραμματιστή του πυρήνα του linux περίπου καιl θέμα ενός συνόλου ενημερώσεις κώδικα για τη διόρθωση ευπαθειών του Spectre στον κώδικα για εργασία με συνδεδεμένες λίστες, έγινε σαφές για πολλούς προγραμματιστές ότι το πρόβλημα θα μπορούσε να λυθεί πιο εύκολα αν επιτρεπόταν στον κώδικα του πυρήνα C que συμμορφώνεται με μια νεότερη έκδοση του προτύπου. 

Και είναι ότι επί του παρόντος ο κώδικας που προστίθεται στον πυρήνα του Linux πρέπει να συμμορφώνεται με την προδιαγραφή ANSI C (C89), η οποία δημιουργήθηκε το 1989.

Αυτός είναι ο λόγος για τον οποίο το πρόβλημα που σχετίζεται με το Spectre στον κώδικα ήταν επειδή se συνέχισε να χρησιμοποιεί επαναλήπτη ορίζεται ξεχωριστά μετά τον βρόχο.

Παρά τη γενικά γρήγορη φύση του, το έργο του πυρήνα βασίζεται σε μια σειρά από παλαιότερα εργαλεία. Ενώ στους επικριτές αρέσει να επικεντρώνονται στην εκτεταμένη χρήση του email από την κοινότητα, ένας πιθανώς πιο σημαντικός αναχρονισμός είναι η χρήση της έκδοσης του 1989 του προτύπου γλώσσας C για τον κώδικα του πυρήνα, ένα πρότυπο που κωδικοποιήθηκε πριν από την έναρξη του έργου του πυρήνα πριν από περισσότερα από 30 χρόνια. Φαίνεται ότι αυτή η μακροχρόνια πρακτική θα μπορούσε να τερματιστεί μόλις ο πυρήνας 5.18, που αναμένεται τον Μάιο του τρέχοντος έτους.

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

Δυστυχώς, υπάρχουν πολλές τοποθεσίες στον πυρήνα όπου βρίσκεται η λίστα
Ο επαναλήπτης χρησιμοποιείται μετά τον βρόχο που διακόπτεται σε μια τέτοια αλλαγή. Ευτυχώς
υπάρχει το σενάριο use_after_iter.cocci που μπορεί να χρησιμοποιηθεί για την αναγνώριση τέτοιων
τοποθεσίες κωδικών. Έπρεπε να προσαρμόσω λίγο το σενάριο καθώς μειώνει το false
θετικά στην αρχική περίπτωση χρήσης, αλλά αυτά σχετίζονται με αυτήν την ενημέρωση κώδικα.

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

Από την πλευρά του, Ο Linus Torvalds συμφώνησε με την ιδέα να είναι σε θέση να υλοποιήσει υποστήριξη για τις νεότερες προδιαγραφές και πρότεινε περαιτέρω τη μετάβαση στον πυρήνα 5.18 για χρήση του προτύπου C11, που κυκλοφόρησε το 2011.

Μετά από αυτό, κατά τη διάρκεια της προκαταρκτικής επαλήθευσης, η τοποθέτηση στο GCC και το Clang στη νέα λειτουργία πέρασε χωρίς απόκλιση. Εκτός εάν προκύψουν απρόβλεπτα προβλήματα λόγω πιο εκτεταμένων δοκιμών, τα σενάρια έκδοσης πυρήνα 5.18 θα αλλάξουν την επιλογή '–std=gnu89' σε '–std=gnu11 -Wno-shift-negative-value'.

Ο Linus Torvalds δεν άρεσε πολύ το patch και δεν είδε πώς σχετίζεται με κερδοσκοπικά τρωτά σημεία εκτέλεσης. Ωστόσο, αφού ο Koschel εξήγησε περαιτέρω την κατάσταση, ο Torvalds συμφώνησε ότι "αυτό είναι απλώς ένα κανονικό σφάλμα, απλό και απλό" και είπε ότι θα έπρεπε να διορθωθεί ανεξάρτητα από τη μεγαλύτερη σειρά. Στη συνέχεια, όμως, εμβάθυνε στην πραγματική πηγή του προβλήματος: ότι ο επαναλήπτης που μεταβιβάστηκε στη λίστα μακροεντολές διέλευσης πρέπει να δηλωθεί σε ένα εύρος εκτός του ίδιου του βρόχου:

Ο κύριος λόγος που μπορεί να προκύψει αυτό το είδος μη κερδοσκοπικού σφάλματος είναι ότι ιστορικά δεν είχαμε "δήλωση μεταβλητών σε βρόχους" τύπου C99. Έτσι, η list_for_each_entry() - και όλες οι άλλες - ουσιαστικά πάντα φιλτράρετε την τελευταία καταχώρηση HEAD έξω από τον βρόχο, απλώς και μόνο επειδή δεν μπορούσαμε να δηλώσουμε τη μεταβλητή iterator στον ίδιο τον βρόχο.

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

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


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

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

*

*

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