Ganzzahlüberlauf

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Die Seiten Arithmetischer Überlauf und Ganzzahlüberlauf überschneiden sich thematisch. Hilf mit, die Artikel besser voneinander abzugrenzen oder zusammenzuführen (→ Anleitung). Beteilige dich dazu an der betreffenden Redundanzdiskussion. Bitte entferne diesen Baustein erst nach vollständiger Abarbeitung der Redundanz und vergiss nicht, den betreffenden Eintrag auf der Redundanzdiskussionsseite mit {{Erledigt|1=~~~~}} zu markieren. suit Rebell at 13x13.jpg 00:18, 16. Dez. 2010 (CET)

Ein Ganzzahlüberlauf (englisch integer overflow) tritt auf, wenn ein Computer Berechnungen mit begrenzter Stellenzahl durchführt und das Rechenergebnis zur Darstellung mehr Stellen erfordert. Die Stellenanzahl und damit der Wertebereich ist durch das Rechenwerk begrenzt.

Das Rechenwerk heutiger Computer ist meist für 32 oder 64 Binärstellen ausgelegt. Tritt hier ein Ganzzahlüberlauf auf, wird das im Statusregister des Prozessors registriert; dieser Fall kann vom Programmierer festgestellt werden.

Ein anderer Fall liegt vor, wenn ein Rechenergebnis in einer Variablen gespeichert wird, die weniger Stellen als das Rechenwerk aufweist. Dieser Fall wird vom Prozessor nicht automatisch erkannt, die Variable erhält einen falschen Wert.

Nur durch die Verwendung von Funktionsbibliotheken ist es möglich, Berechnungen mit Millionen von Stellen durchzuführen ohne einen Ganzzahlüberlauf zu erreichen.

Ein Beispiel aus der ProgrammierspracheC“: Der Datentyp unsigned char umfasst 8 Bit. Sein Wertebereich reicht von 0 bis 255.

unsigned char a = 255;
unsigned char b = 2;
unsigned char Ergebnis = a + b;

Die zugehörige duale Rechnung veranschaulicht den Ganzzahlüberlauf:

  11111111 (a)
+ 00000010 (b)
----------
 100000001 (Ergebnis)


Die vordere Eins, das neunte Bit, ist nicht in den 8 Bit des gewählten Datentyps enthalten. Betrachtet man nur diese letzten 8 Bit, so erhält man 00000001, also 1 und nicht 257. Selbst wenn die Zahlenwerte bei der Übersetzung des Programmcodes schon feststehen, ignorieren manche C-Compiler diese Überläufe, was zu falschen Ergebnissen führt. Daher sollte der Datentyp immer ausreichend groß gewählt werden.

Bei plattformunabhängiger Programmierung sollte der Ganzzahlüberlauf nicht absichtlich benutzt werden, da der Wertebereich der Datentypen und damit der Punkt des Überlaufs auf den Zielsystemen unterschiedlich sein kann.

Gefahren durch Ganzzahlüberläufe[Bearbeiten]

Ganzzahlüberläufe können indirekt ein sicherheitsrelevantes Problem darstellen, wenn sie Teil eines Programmfehlers sind. Insbesondere wenn die fehlerhafte Berechnung zur Bestimmung der Größe eines Puffers genutzt wird oder die Adressierung eines Feldes betrifft. Dann können daraus Pufferüberläufe resultieren oder es einem Angreifer ermöglichen den Stack zu überschreiben.

Einen Spezialfall stellt der sogenannte Signedness Bug dar. Er tritt auf, wenn eine vorzeichenbehaftete Ganzzahl (signed) als positive Zahl (unsigned) interpretiert wird.

Die Tragweite von Ganzzahlüberlaufen liegt oft auch darin, dass sie nicht erkannt werden können, nachdem sie erfolgt sind. Derart fehlerbehafte Stellen sind im Programmcode deshalb nur schwer zu finden.

Literatur[Bearbeiten]