www.wikidata.de-de.nina.az
Ein Off by one Error oder Off by one Fehler abgekurzt OBOE deutsch etwa Um Eins daneben Fehler 1 oder Plus minus eins Syndrom 2 scherzhaft auch Obi Wan error da ahnlich klingend oder 1 Problem bezeichnet in der Informatik einen Programmierfehler bei dem eine Zahlenangabe oder eine Anzahl ausgefuhrter Schritte um 1 zu gross oder zu klein ist Zum Beispiel ist die Grosse eines Speicherblocks um 1 falsch oder es wird in einem Puffer um einen Schritt zu weit in den Speicher geschrieben wobei der Speicher eines anderen Puffers bzw einer Variable uberschrieben wird 3 Inhaltsverzeichnis 1 Allgemeines 2 Haufige Ursachen Auswahl 3 Folgen 4 Beispiele 5 Weblinks 6 EinzelnachweiseAllgemeines BearbeitenOff by one Fehler ereignen sich oft im Umgang mit Datenfeldern Arrays Vektoren Listen Zeichenketten oder anderen indizierbaren Datentypen Off by one Fehler konnen leicht unterlaufen und sind sehr schwer zu finden vor allem da sie sich sehr haufig nur unter ganz speziellen Bedingungen bemerkbar machen Auch bei der Durchsicht des Quelltextes konnen sie sehr leicht ubersehen werden Erschwerend kommt hinzu dass Indizes oder Offsets im Quelltext meist durch Variablen oder Formeln gebildet werden Massnahmen von Compiler Interpreter oder ggf Betriebssystemen die ein Uberschreiten einer Puffergrenze um jedes einzelne Byte registrieren greifen auch nur in dem Spezialfall dass der gesamte reservierte Puffer genutzt werden soll Wenn ein Off by one Fehler gefunden und lokalisiert ist ist er in der Regel sehr einfach zu beheben Haufige Ursachen Auswahl BearbeitenEs gibt verschiedenste Fehlerursachen die im Ergebnis zu einem Off by one Fehler fuhren Beispiele Eine haufige Fehlerquelle ist der Umstand dass man bei der Programmierung das Zahlen haufig bei 0 beginnt und nicht mit 1 zero based numbering Bei einem Array mit 10 Datenfeldern bedeutet das dass die Datenfelder nicht die Indizes 1 bis 10 haben sondern die Indizes 0 bis 9 In einer Schleife von 0 bis Lange wird somit auf ein elftes Element Index 10 zugegriffen Eine weitere haufige Fehlerquelle ist die Verwendung von Nullbytes vor allem bei Zeichenketten also Text Das Nullbyte ist ein in Text nicht vorkommendes Zeichen mit dem Wert 0 und markiert das Ende einer Zeichenkette wahrend der eigentliche Puffer fur die Zeichenkette um ein Vielfaches grosser sein kann Dadurch muss man bei variablen Pufferinhalten die Puffergrosse nicht standig verandern und ebenso die Lange der Zeichenkette nicht separat angeben Durch das Nullbyte ist eine Zeichenkette allerdings prinzipiell um ein Zeichen langer als die Zeichenkette an sich lang ist Beispielsweise ist die Zeichenkette Hallo somit zwar 5 Zeichen lang benotigt aber 6 Zeichen im Speicher Funktionen die die Lange einer Zeichenkette ermitteln und zuruckgeben zahlen das Nullbyte nicht mit Off by one Fehler treten auch haufig als Folge sogenannter Zaunpfahlfehler auf also durch die Verwechslung von Distanzen und Anzahlen bei der Indizierung Falls gar nichts zu tun ist z B bei Analyse einer leeren Zeichenkette wird eine nachprufende Schleife einmal also einmal zu oft ausgefuhrt Folgen BearbeitenIm Falle eines Off by one Errors wird typischerweise beim Schreiben der Schleife die ein Feld verarbeiten soll die Abbruch bzw Fortsetzungsbedingung falsch gewahlt sodass im Rumpf der Schleife eine Anweisung die indexbasiert auf das Feld zugreift genau einmal zu oft oder einmal zu wenig ausgefuhrt wird wodurch entweder versucht wird auf ein Element des Feldes zuzugreifen das nicht existiert oder das letzte bzw erste Element des Feldes ausgelassen wird Im erstgenannten Fall ist oft ein Index out of upper Range Fehler o a die auffallige Folge im letztgenannten Fall wird mitunter gar kein Fehler sichtbar solange nicht die gesamte Puffergrosse genutzt werden soll oder ein Index out of lower Range Fehler gemeldet wird Ein Off by one Fehler kann durchaus zu einem Absturz des Programms fuhren wenn im Speicher nach dem Puffer wichtige Daten liegen die von der Schleife dann uberschrieben werden z B Zeiger auf eine Struktur Grundsatzlich kann nach einem Puffer im Arbeitsspeicher auch Programmcode liegen wobei in der Regel ein zufalliges Uberschreiben ebenfalls einen Programmabsturz verursacht da die Daten keinem gultigen Maschinenbefehl entsprechen Beispiele BearbeitenBeispiel aus der Sprache C double nettopreise 10 double bruttopreise 10 int i nettopreise initialisieren for i 0 i lt 10 i bruttopreise i nettopreise i 1 19 MwSt aufschlagen In diesem Fall musste es i lt 10 oder i lt 9 und nicht i lt 10 heissen da in der Deklaration zwar 10 als Feldgrosse angegeben wurde aber aufgrund der Nullbasiertheit von C der maximale Index 9 ist Haufig resultiert diese Art der Fehler aus der Verwirrung die dadurch entsteht dass Menschen von 1 bis N zahlen Feldindizes in vielen Programmiersprachen aber von 0 bis N 1 gehen 4 Dann gibt es auch noch das Grosser als Zeichen und das Grosser gleich Zeichen die man verwechseln kann Daruber hinaus kann die Abbruchbedingung komplizierter ausfallen so dass sich an dieser Stelle haufig Off by one Fehler ergeben Besonders tuckisch ist der Fall einer Datenstruktur die doch mit 1 beginnt jedoch Schleifenzahlungen uber diese Datenstruktur mit 0 beginnen Ebenfalls kann leicht ein Off by one Fehler unterlaufen wenn bei Bereichsgrenzen nicht beachtet wird ob die untere und obere Schranke einschliessend oder ausschliessend sind So liefert die Funktion substring in Java den Teil eines Strings der die untere Schranke mit einschliesst die obere aber nicht Will man beispielsweise aus dem Wort Foobar das Teilwort bar herauslosen indem man die Buchstaben durchzahlt so kann man sich bei der oberen Schranke leicht vertun selbst wenn man korrekt bei 0 zu zahlen beginnt Da das Wort bar die Buchstaben bei den Indizes 3 4 und 5 umfasst ist man versucht substring 3 5 aufzurufen Als Ergebnis wurde man aber nur ba erhalten Um dieses Problem zu vermeiden benutzen andere Programmiersprachen wie C C JavaScript oder PHP anstelle der Parameter Start Index und End Index die Parameter Start Index und Lange der gewunschten Zeichenkette Weblinks Bearbeitenoff by one error im Free On line Dictionary of Computing englisch Einzelnachweise Bearbeiten userpage fu berlin de Agidius Pluss Java exemplarisch learning by doing Oldenbourg Wissenschaftsverlag 2004 ISBN 3 486 20040 2 S 51 foldoc org Dieter Masak Legacysoftware Das lange Leben der Altsysteme Springer Verlag 2005 ISBN 3 540 25412 9 S 161 Abgerufen von https de wikipedia org w index php title Off by one Error amp oldid 229038891