Τι είναι ένας ακέραιος Υπερχείλιση;

Αυτό 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 δοκιμή). Ωστόσο, ο αριθμός των σημαντικών ψηφίων είναι πολύ μικρότερη από αυτή.

Writing Secure Code Building Secure Software Ασφαλής και κωδικοποίησης των εμπορευμάτων Ασφαλής Προγραμματισμός Cookbook
Αγορά αυτά τα εξαιρετικά βιβλία για ασφαλή προγραμματισμό σε Amazon.com


Top 5 Free δικτύωση Εργαλεία

Ένα θέμα ευπάθειας Διαχείρισης για Ανδρείκελα

Οι φίλοι μας στο Qualys προσφέρουν δωρεάν αντίγραφα της ηλεκτρονικής μορφής των Vulnerability Management για να Ανδρείκελα Tech-Συχνές ερωτήσεις αναγνωστών.

Ένα θέμα ευπάθειας Διαχείρισης για Ανδρείκελα:

  • Εξηγεί την ανάγκη για διαχείριση της ευπάθειας
  • Στοιχεία τα βασικά βήματα βέλτιστες πρακτικές για ένα επιτυχές πρόγραμμα διαχείρισης της ευπάθειας
  • Περιγράφει τις διάφορες λύσεις διαχείρισης της ευπάθειας - συμπεριλαμβανομένων των πλεονεκτημάτων και μειονεκτημάτων της κάθε
  • Σημαντικά γεγονότα το βραβευμένο QualysGuard ευπάθεια λύση διαχείρισης
  • Παρέχει τις δέκα το σημείο ελέγχου για την αφαίρεση από τα τρωτά σημεία σας βασικούς πόρους
Bookmark Τι είναι ένας ακέραιος Υπερχείλιση;

Τελευταίες θέσεις Blog


Αγγλικά Αγγλικά Γερμανικά Γερμανικά Ισπανικά Ισπανικά Γαλλικά Γαλλικά Ιταλικά Ιταλικά Πορτογαλικά Πορτογαλικά Ρωσικά Ρωσικά Ολλανδικά Ολλανδικά
Ελληνικά Ελληνικά Χίντι Χίντι Ιαπωνικά Ιαπωνικά Κορεατικά Κορεατικά Κινεζικά Κινεζικά Κινέζικα (απλοποιημένα) Κινέζικα (απλοποιημένα) Αραβικά Αραβικά

Copyright 2009-Tech FAQ. Με επιφύλαξη κάθε νόμιμου δικαιώματος. Πολιτική Προστασίας Προσωπικών Δεδομένων.