Τι είναι ένας ακέραιος Υπερχείλιση;
Αυτό FAQ απάντηση ήταν γραμμένο από k4thryn:
Ένας integer υπερχείλιση, ακέραιος ή τη συσκευασία, είναι ένα πιθανό πρόβλημα σε ένα πρόγραμμα με βάση το γεγονός ότι η αξία που μπορεί να διατηρείται σε αριθμητικό τύπο δεδομένων περιορίζεται από τον τύπο δεδομένων της μέγεθος σε bytes. ANSI C χρησιμοποιεί το ακόλουθο ελάχιστο μέγεθος:
| τύπος δεδομένων | Μέγεθος (byte) |
|---|---|
| char | 1 |
| κοντός | 2 |
| int | 2 |
| μακρύς | 4 |
Στην πράξη, πολλά μεταγλωττιστές χρησιμοποιούν ένα 4-byte int. Επίσης πρέπει να σημειωθεί ότι το πραγματικό εύρος των τύπων των δεδομένων εξαρτάται από το αν ή δεν έχουν υπογράψει. για παράδειγμα, μια υπογεγραμμένη 2-byte βραχυπρόθεσμα μπορεί να είναι μεταξύ -32.767 και 32.767, ενώ μια σύντομη unsigned μπορεί να είναι μεταξύ 0 και 65535. Βλέπε σας [περιλαμβάνει] / limits.h αρχείο για συγκεκριμένους αριθμούς για το μεταγλωττιστή.
Γιατί να σας νοιάζει; Αν προσπαθήσουμε να θέσουμε μια τιμή σε ένα τύπο δεδομένων που είναι πολύ μικρή για να την κρατά, το υψηλό-προκειμένου bits έχουν πέσει, και μόνο τα άτομα με χαμηλή ώστε δυφία αποθηκεύονται. Ένας άλλος τρόπος για να πούμε ότι είναι ότι modulo-αριθμητική γίνεται με την τιμή πριν την αποθηκεύσετε για να βεβαιωθείτε ότι εντάσσεται στα δεδομένα. Λαμβάνοντας μας ανυπόγραφα σύντομο παράδειγμα:
| Όριο: | 65535 ή 1111 1111 1111 1111 |
| Πάρα πολύ μεγάλο: | 65.536 ή 1 0000 0000 0000 0000 |
| Τι να αποθηκεύονται: | 0 ή 0000 0000 0000 0000 |
Δεδομένου ότι η ανωτέρω καθιστά φανερό, ότι επειδή το αποτέλεσμα είναι υψηλής τάξης (ή πιο αριστερά) λίγο η τιμή που έχει πέσει πολύ μεγάλο. Ή θα μπορούσαμε να πούμε ότι αυτό που είναι αποθηκευμένο το αποτέλεσμα της
αποθηκεύονται = τιμή% (όριο + 1) ή 65.536% (65.535 + 1) = 0
Σε υπογράφηκε τύποι δεδομένων, το αποτέλεσμα είναι λίγο διαφορετική και έχει ως αποτέλεσμα κάποιες φαινομενικά παράξενες συμπεριφορές:
| Θετικό όριο: | 32767 ή 0111 1111 1111 1111 |
| Πάρα πολύ μεγάλο: | 32768 ή 1000 0000 0000 0000 |
| Τι να αποθηκεύονται: | -32768 |
Γιατί είναι αυτό; Είναι λόγω του "2 του κομπλιμέντο," το οποίο είναι αρνητικό πως οι αριθμοί που εκπροσωπούνται στο δυαδικό. Για να πραγματοποιήσετε μια μακρά ιστορία σύντομη, το πρώτο εξάμηνο του φάσματος (0 έως 0111 1111 1111 1111) έχει χρησιμοποιηθεί για θετικούς αριθμούς, ώστε τουλάχιστον να μεγαλύτερες. το δεύτερο εξάμηνο του φάσματος στη συνέχεια χρησιμοποιείται για τους αρνητικούς αριθμούς, ώστε τουλάχιστον να μεγαλύτερες. τόσο οι αρνητικές για ένα φάσμα που υπεγράφη 2-byte είναι σύντομη -32.768 μέσω -1, με αυτή τη σειρά.
Έχετε τον λόγο αυτό ζητούν ακόμη θέματα, δεν είναι; Ας υποθέσουμε ότι η μνήμη είναι που κατανέμονται με βάση μια unsigned ακέραιος τύπος δεδομένων της αξίας. Εάν αυτή η τιμή έχει τυλιχτεί γύρω, μπορεί να είναι ότι πολύ λίγα μνήμης θα είναι διαθέσιμα. Ή αν η σύγκριση γίνεται μεταξύ ενός υπεγράφη ακέραια τιμή και κάποια άλλη σειρά, με την προϋπόθεση ότι το προηγούμενο θα πρέπει να είναι μικρότερο από το δεύτερο, εάν η τιμή έχει διέλθει για τις αρνητικές, η σύγκριση θα περάσει. Όμως, τα πράγματα θα είναι να συμπεριφέρονται με τον τρόπο ο προγραμματιστής που προορίζονται; Μάλλον δεν.
Διάφορες πηγές πληροφόρησης σχετικά με Integer υπερχειλίσεις
Αν και είναι πέρα από το πεδίο εφαρμογής του παρόντος άρθρου, υπάρχουν και άλλοι πόροι που πάμε σε περισσότερες λεπτομέρειες σχετικά με σφάλματα υπερχείλισης ακεραίου, η πρόληψή τους, και στην αξιοποίησή τους. Συγκεκριμένα, υπάρχουν δύο πολύ ενδιαφέροντα άρθρα του Phrack # 60 (ένας από Oded Horovitz, και ένας από blexim) για ευπάθειες υπερχείλισης ακεραίου. Integer περιτύλιγμα καλύπτεται επίσης στην "επαγγελματική πηγαίο κώδικα ελέγχου" παρουσίαση από το 2002 ΗΠΑ Black Hat Ενημερώσεις (Dowd, et als).
Ένα εργαλείο για να Πειραματιστείτε με Integer υπερχειλίσεις
Το πρόγραμμα int_wrap.c σας επιτρέπει να παίζουν με αυτή τη συμπεριφορά με την ένδειξη για το εάν η γραμμή τύπου δεδομένων (μικρού μήκους) πρέπει να έχουν υπογραφεί ή ανυπόγραφα, και τιμή που θέλετε να χρησιμοποιήσετε.
Σημείωση: Perl, φαίνεται να υπάρχει ένα όριο 250-ψηφία για τους αριθμούς, και πεθαίνει με το σφάλμα "Ο αριθμός είναι πολύ μεγάλο" (έκδοση 5.8.0 δοκιμή). Ωστόσο, ο αριθμός των σημαντικών ψηφίων είναι πολύ μικρότερη από αυτή.
|
Ένα θέμα ευπάθειας Διαχείρισης για Ανδρείκελα
Τελευταίες θέσεις Blog
- SourceForge έναντι Freshmeat






