Off-by-one Fehler

Eine Off-by-one Fehler ist ein Logikfehler, die die diskrete Äquivalent einer Randbedingung. Es tritt häufig in Computer-Programmierung, wenn eine iterative Schleife wiederholt einmal zu viele oder zu wenige. Dieses Problem könnte entstehen, wenn ein Programmierer macht Fehler wie die Verwendung von "kleiner oder gleich", wo "kleiner als" sollten in einem Vergleich verwendet wurden oder nicht zu berücksichtigen, dass eine Sequenz beginnt bei Null statt einer. Dies kann auch in einem mathematischen Kontext auftreten.

Schleifen über Feldern

Betrachten wir ein Array von Elementen und Artikel M durch n zu verarbeiten sind. Wie viele Artikel gibt es? ; M, aber das ist durch eine, einen Zaunpfahl Fehler aufweist - eine intuitive Antwort kann n Die richtige Antwort ist n-m + 1.

Aus diesem Grund reicht in Computing werden oft von halboffenen Intervallen dargestellt; der Bereich von m zu n durch den Bereich von m auf n + 1 dargestellt, um fencepost Fehler zu vermeiden. Beispielsweise kann eine Schleife, die fünf Mal iteriert als halboffenen Intervall 0-5 geschrieben werden:

Der Schleifenkörper wird ausgeführt zunächst mit i gleich 0 ist; i wird dann 1, 2, 3, und schließlich auf 4 aufeinanderfolgenden Iterationen. An diesem Punkt wird zu i 5, so i & lt; 5 ist falsch und die Schleife endet. Wenn jedoch der Vergleich verwendet wurden, waren & lt; = der Schleife würde sechsmal durchgeführt werden: i nimmt die Werte 0, 1, 2, 3, 4 und 5. Ebenso, wenn i zu 1 anstatt 0 initialisiert wird, gibt würde nur vier Iterationen sein: i nimmt die Werte 1, 2, 3 und 4. Diese beiden Alternativen kann off-by-one Fehler verursachen.

Ein weiterer solcher Fehler kann auftreten, wenn eine do-while-Schleife wird anstelle einer while-Schleife A verwendet, do-while-Schleife wird garantiert, um mindestens einmal ausgeführt.

Array-bezogene Verwirrung kann auch aus Unterschieden in Programmiersprachen führen. Nummerierung von 0 ist am häufigsten, aber einige Sprachen starten Array Nummerierung mit 1. Pascal hat Arrays mit benutzerdefinierten Indizes. Dies macht es möglich, die Array-Indizes nach dem Problembereich zu modellieren.

Fencepost Fehler

Ein fencepost Fehler ist eine bestimmte Art von Off-by-one Fehler. Folgendes Problem veranschaulicht den Fehler:

Die intuitive Antwort 10 ist falsch. Der Zaun hat 10 Abschnitte, aber 11 Beiträge.

Die Rückwärtsfehler auftritt, wenn die Zahl der Stellen bekannt ist und die Anzahl der Abschnitte ist gleich angenommen werden. Die tatsächliche Anzahl der Abschnitte ist eins weniger als die Anzahl der Planstellen.

Allgemeiner kann das Problem wie folgt formuliert werden:

Die richtige Antwort kann n - 1, wenn die Linie der Pole ist offen, n, wenn sie eine Schleife bilden, oder n + 1, wenn die offenen Seiten der Sequenz der Pole als Abschnitte zählen. Die genaue Aufgabenstellung muss sorgfältig geprüft werden, wie das Setup für eine Situation kann die falsche Antwort für andere Situationen geben. Fencepost Fehlern kommen aus eher zu zählen Dinge, als die Räume zwischen ihnen, oder umgekehrt, oder durch Vernachlässigung zu prüfen, ob man eine beide Enden eines Zeilenanzahl oder.

Fencepost Fehler können auch in anderen als Längeneinheiten auftreten. Zum Beispiel kann die Zeit Pyramide, bestehend aus 120 Blöcken mit 10 Jahres-Abständen zwischen den Blöcken platziert, wird voraussichtlich bis 1190 Jahre, um zu bauen, von der Installation des ersten Blocks mit dem letzten Block. Eine der frühesten fencepost Fehler beteiligt Zeit, in der Julianische Kalender ursprünglich berechneten Schaltjahren falsch, aufgrund pauschal anstatt wobei nur, was ein Schaltjahr alle drei Jahre statt alle vier.

"Fencepost Fehler" kann in seltenen Fällen zu einem Fehler durch unerwartete Regelmäßigkeiten in Eingabewerte induziert, die eine theoretisch effizienter Binärbaum oder Hash-Funktion Implementierung vollständig zu durchkreuzen können beziehen. Dieser Fehler betrifft den Unterschied zwischen erwarteten und Worst-Case-Verhalten eines Algorithmus.

In größerer Zahl als off-by-one ist oft kein großes Problem. In geringerer Zahl, aber, und spezifischen Fällen, in denen die Genauigkeit ist von größter Bedeutung ein Off-by-one Fehler begehen, können verheerend sein. Manchmal eine solche Frage auch wiederholt werden, und daher verschlechtert, von jemandem vorbei auf eine falsche Berechnung, wenn die folgende Person macht die gleiche Art von Fehler nicht noch einmal.

Ein Beispiel für diese Fehler kann in der Rechen Matlab mit der Funktion, deren Parameter und nicht auf. Ein Programmierer, der den dritten Parameter missversteht, um die Anzahl der Inkremente könnte hoffen, dass eine Sequenz zu erzielen wäre, sondern bekommen würde.

Auswirkungen auf die Sicherheit

Eine gemeinsame off-by-one Fehler, der in einem sicherheitsrelevanten Fehler führt durch Missbrauch der C-Standardbibliothek Routine verursacht. Ein häufiges Missverständnis ist, dass mit der garantierte Null-Terminierung nicht über die maximale Länge zu schreiben. In der Realität wird es eine abschließende Nullzeichen ein Byte jenseits des festgelegten maximalen Länge zu schreiben. Der folgende Code enthält einen solchen Bug:

Off-by-one Fehler sind bei der Verwendung der C-Bibliothek gemeinsam, da sie nicht im Einklang mit Bezug auf, ob man auf 1 Byte subtrahieren muss - Funktionen wie und wird nie zu schreiben über die Länge gegeben ihnen Bytes), während andere, wie wird Vergangenheit schreiben die Länge ihnen gegeben. So muss der Programmierer zu erinnern, für welche Funktionen sie zu subtrahieren 1 benötigen.

Auf einigen Systemen kann dies im Überschreiben der niederwertige Byte des Rahmenzeiger führen. Dies kann einen nutzbaren Zustand, in dem ein Angreifer die lokalen Variablen für die aufrufende Routine entführen verursachen.

Eine Vorgehensweise, die oft hilft diese Probleme zu vermeiden ist es, Varianten dieser Funktionen, wie viel von der Gesamtlänge des Puffers, anstatt die maximale Anzahl der zu schreibenden Zeichen basierend Schreib Berechnung verwenden. Solche Funktionen umfassen und, und werden oft "sicherer" betrachtet, weil sie machen es einfacher, nicht versehentlich über das Ende eines Puffers schreiben.

(0)
(0)
Kommentare - 0
Keine Kommentare

Fügen Sie einen Kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Zeichen übrig: 3000
captcha