off-by-one error

folclore

programação

O erro clássico de contar um a mais ou um a menos, sobretudo nos limites de um laço ou intervalo.

Também chamado de erro de poste de cerca (dez postes seguram nove painéis, não dez), é o bug que mora no < contra o <=, ou no primeiro e no último elemento. É tão comum que é praticamente um rito de passagem, e por isso casos de borda ganham seus próprios testes.

O erro de um a mais é o defeito que mora no menor que versus menor ou igual, no primeiro índice e no último, na fronteira e não na lógica. Também é chamado de erro de poste de cerca, da observação de que dez postes sustentam nove painéis, que é a mesma confusão numa forma que as pessoas acham intuitiva.

Sua persistência não é desleixo, é que as fronteiras são genuinamente onde o modelo mental é mais fino. O meio de um laço é fácil de raciocinar porque é igual todas as vezes; o começo e o fim são casos especiais que exigem segurar um quadro ligeiramente diferente, e cada conversão entre contagem começando em zero e em um é uma oportunidade de segurar o errado.

A dimensão de segurança é por que isso importa além da correção. Um buffer escrito um byte além do fim é uma primitiva clássica de corrupção de memória, e uma verificação de limites com a comparação errada é vulnerabilidade, não incômodo. É por isso que as defesas são estruturais, e não atencionais: linguagens com verificação de limites, iteradores que tornam a fronteira implícita, e testes escritos especificamente para o caso vazio, o de um elemento, e o limite exato.

Também conhecido como: off by one, obo, fencepost error, fencepost

Fontes

  • The Jargon File ("fencepost error")

Todos os verbetes do glossário