Το 3.6% των αποθετηρίων Python που δοκιμάστηκαν είχαν σφάλματα κόμματος που έλειπαν

Δημοσιεύτηκαν τα αποτελέσματα μιας μελέτης σχετικά με την ευπάθεια του κώδικα Python σε σφάλματα που σχετίζονται με την εσφαλμένη χρήση κόμματος στον κώδικα. Τα προβλήματα προκαλούνται από το γεγονός ότι κατά την απαρίθμηση, η Python συνενώνει αυτόματα τις συμβολοσειρές στη λίστα εάν δεν χωρίζονται με κόμμα, και επίσης αντιμετωπίζει την τιμή ως πλειάδα εάν η τιμή ακολουθείται από κόμμα. Αφού διεξήγαγαν μια αυτοματοποιημένη ανάλυση 666 αποθετηρίων GitHub με κώδικα Python, οι ερευνητές εντόπισαν πιθανά προβλήματα με κόμματα στο 5% των έργων που μελετήθηκαν.

Περαιτέρω χειροκίνητη επιθεώρηση έδειξε ότι υπήρχαν πραγματικά σφάλματα μόνο σε 24 αποθετήρια (3.6%) και το υπόλοιπο 1.4% ήταν ψευδώς θετικά (για παράδειγμα, ένα κόμμα θα μπορούσε σκόπιμα να παραλειφθεί μεταξύ των γραμμών για τη σύνδεση μονοπατιών αρχείων πολλών γραμμών, μεγάλου κατακερματισμού, HTML μπλοκ ή εκφράσεις SQL). Αξίζει να σημειωθεί ότι μεταξύ των 24 αποθετηρίων με πραγματικά σφάλματα ήταν τόσο μεγάλα έργα όπως το Tensorflow, το Google V8, το Sentry, το Pydata xarray, το rapidpro, το django-colorfield και το django-helpdesk. Ωστόσο, τα προβλήματα με κόμματα δεν είναι συγκεκριμένα για την Python και συχνά εμφανίζονται σε έργα C/C++ (παραδείγματα πρόσφατων διορθώσεων είναι τα LLVM, Mono, Tensorflow).

Οι κύριοι τύποι σφαλμάτων που μελετήθηκαν:

  • Κατά λάθος λείπει κόμμα σε λίστες, πλειάδες και σύνολα, με αποτέλεσμα οι συμβολοσειρές να συνδέονται αντί να ερμηνεύονται ως ξεχωριστές τιμές. Για παράδειγμα, στο Sentry, ένα από τα τεστ έχασε ένα κόμμα μεταξύ των συμβολοσειρών "releases" και "discover" στη λίστα, με αποτέλεσμα να ελεγχθεί ένας ανύπαρκτος χειριστής "/releasesdiscover", αντί να ελεγχθεί "/releases" και " /discover" ξεχωριστά.
    Το 3.6% των αποθετηρίων Python που δοκιμάστηκαν είχαν σφάλματα κόμματος που έλειπαν

    Ένα άλλο παράδειγμα είναι ότι ένα κόμμα που λείπει στο rapidpro προκάλεσε τη συγχώνευση δύο διαφορετικών κανόνων στη γραμμή 572:

    Το 3.6% των αποθετηρίων Python που δοκιμάστηκαν είχαν σφάλματα κόμματος που έλειπαν

  • Ένα κόμμα που λείπει στο τέλος ενός ορισμού πλειάδας ενός στοιχείου, με αποτέλεσμα η ανάθεση να εκχωρεί έναν κανονικό τύπο αντί για μια πλειάδα. Για παράδειγμα, η έκφραση "τιμές = (1,)" θα έχει ως αποτέλεσμα μια αντιστοίχιση σε μια μεταβλητή μιας πλειάδας ενός στοιχείου, αλλά "τιμές = (1)" θα έχει ως αποτέλεσμα μια εκχώρηση ακέραιου τύπου. Οι παρενθέσεις στις παραπάνω αναθέσεις δεν επηρεάζουν τον ορισμό του τύπου και είναι προαιρετικές και η παρουσία πλειάδας καθορίζεται από τον αναλυτή μόνο με βάση την παρουσία κόμματος. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( στο 'rest_framework.permissions.IsAuthenticated' # θα εκχωρηθεί μια συμβολοσειρά αντί για πλειάδα. ) }
  • Η αντίθετη κατάσταση είναι τα επιπλέον κόμματα κατά την ανάθεση. Εάν ένα κόμμα αφεθεί κατά λάθος στο τέλος μιας ανάθεσης, μια πλειάδα θα εκχωρηθεί ως τιμή αντί για τον συνηθισμένο τύπο (για παράδειγμα, εάν οριστεί "τιμή = 1", αντί για "τιμή = 1").

Πηγή: opennet.ru

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