Définition
Une erreur logique où un indice, une borne de boucle ou un compteur inclut ou exclut incorrectement un point terminal, produisant un décalage d'un élément qui peut causer des résultats erronés ou des accès hors‑plage.
Principe
Principe
Beaucoup d'algorithmes reposent sur des conditions frontières précises (intervalle inclusif vs exclusif) ; une seule erreur de ±1 dans l'arithmétique d'index ou la condition d'arrêt modifie l'appartenance de l'ensemble traité et peut produire des bogues subtils.
Démonstration
Démonstration
Une boucle écrite for (i = 0; i <= n; ++i) alors que l'intention était de traiter n éléments indexés 0..n‑1 itère une fois de trop, pouvant accéder à array[n] hors‑bornes ; inversement, utiliser < là où <= était requis fait manquer le dernier élément.
Mauvaise application
Mauvaise application
Considérer chaque cas off‑by‑one comme trivial ou en ignorer les implications en sécurité ; ou attribuer un écart algorithmique uniquement à un off‑by‑one alors que le vrai problème est un invariant incorrect ou une arithmétique off‑by‑two ailleurs.
Conséquence
Conséquence
Raisonner correctement sur les frontières élimine des classes entières de bogues d'indexation et d'itération, empêche les erreurs d'accès mémoire accidentelles et produit des invariants de boucle corrects ; non corrigé, il entraîne des sorties incorrectes, des exceptions ou des vulnérabilités.
Inversion
Inversion
Adopter la convention d'intervalle semi‑ouvert (début inclus, fin exclue), utiliser des itérateurs de bibliothèque qui portent les bornes, ou prouver des invariants de boucle inverse les erreurs off‑by‑one en alignant le code sur une sémantique de frontière claire.
Limite
Limite
S'applique quand on utilise un indexage ou un comptage discret (tableaux, boucles, tranches). N'inclut pas les erreurs logiques d'ordre supérieur non réductibles à un décalage d'une unité et l'off‑by‑one se distingue des cas manquants ou des incompréhensions de seuil.
Tension sémantique
Tension sémantique
Étroitement lié à « fencepost error » et « erreur d'indexation » ; la tension provient du fait que certains considèrent l'off‑by‑one comme une faute syntaxique triviale alors que dans des algorithmes complexes il signale une mauvaise conception des frontières ou des invariants.
Synthèse
Synthèse
L'erreur d'un décalage d'une unité est la faute de condition limite qui décale l'inclusion/exclusion d'une unité—fondée sur la nécessité d'une arithmétique d'index précise—observable dans boucles et indexations, parfois minimisée mais pouvant causer des accès hors‑plage, et évitée par des conventions explicites ou des invariants formels.