Articulo de referencia

Error de un punto

Un error de uno o error de uno (conocido por los acrónimos OBOE , OBOB , OBO y OB1 ) es un error lógico que implica un número que difiere de su valor previsto en 1. Un error de ...

Un error de uno o error de uno (conocido por los acrónimos OBOE , OBOB , OBO y OB1 ) es un error lógico que implica un número que difiere de su valor previsto en 1. Un error de uno puede aparecer a veces en un contexto matemático . También suele ocurrir en la programación informática cuando un bucle se ejecuta una vez de más o de menos, generalmente debido al uso de una desigualdad no estricta (≤) como condición de terminación donde debería haberse utilizado una desigualdad estricta (<), o viceversa. Los errores de uno también se derivan de la confusión sobre la numeración basada en cero .

Casos

Error en el poste de la cerca

Un error de poste de cerca (ocasionalmente llamado error de poste telegráfico , poste de farola o cerca de estacas ) es un tipo específico de error de uno. Una descripción temprana de este error aparece en las obras de Vitruvio . [ 1 ] El siguiente problema ilustra el error:

Si construyes una cerca recta de 30 pies de largo con postes separados por 3 pies, ¿cuántos postes necesitas?

Una valla recta con 10 secciones requiere 11 postes. En términos más generales, n secciones requerirían n + 1 postes.

La respuesta común de 10 postes es incorrecta. Esta respuesta proviene de dividir la longitud de la cerca entre la distancia entre cada poste, y el cociente se clasifica erróneamente como el número de postes. En realidad, la cerca tiene 10 secciones y 11 postes.

En este caso, una cerca con n secciones tendrá n + 1 postes. Por el contrario, si la cerca tiene n postes, tendrá n − 1 secciones. Esta relación es importante a tener en cuenta al tratar con el error inverso. El error inverso ocurre cuando se conoce el número de postes y se asume que el número de secciones es el mismo. Dependiendo del diseño de la cerca, esta suposición puede ser correcta o incorrecta.

El siguiente problema demuestra el error inverso:

Si tienes n publicaciones, ¿cuántas secciones hay entre ellas?

La interpretación del diseño de la cerca modifica la respuesta a este problema. El número correcto de secciones para una cerca es n − 1 si la cerca es un segmento de línea independiente delimitado por un poste en cada uno de sus extremos (por ejemplo, una cerca entre dos huecos de paso), n si la cerca forma un circuito completo e independiente (por ejemplo, un recinto accesible por encima, como un ring de boxeo), o n + 1 si no hay postes en los extremos de una cerca con forma de segmento de línea (por ejemplo, una cerca entre dos edificios anclada a la pared). La definición precisa del problema debe considerarse cuidadosamente, ya que la configuración para una situación puede dar una respuesta incorrecta para otras.

Los errores en los cálculos también pueden ocurrir en unidades distintas a la longitud. Por ejemplo, la Pirámide del Tiempo , que consta de 120 bloques colocados a intervalos de 10 años entre sí, está programada para tardar 1190 años en construirse (no 1200), desde la instalación del primer bloque hasta el último. Uno de los primeros errores en los cálculos tuvo que ver con el tiempo, ya que el calendario juliano originalmente calculaba incorrectamente los años bisiestos , debido a que contaba de forma inclusiva en lugar de exclusiva, lo que resultaba en un año bisiesto cada tres años en lugar de cada cuatro.

Un ejemplo de este error puede ocurrir en el lenguaje de programación MATLAB con la función linspace()de interpolación lineal , cuyos parámetros son y no . Un programador que malinterpreta el tercer parámetro como el número de incrementos podría esperar que se lograra una secuencia, pero en su lugar obtendría .(lower value, upper value, number of values)(lower value, upper value, number of increments)linspace(0,10,5)[0, 2, 4, 6, 8, 10][0, 2.5, 5, 7.5, 10]

Iterar sobre matrices

Consideremos un conjunto de elementos, y los elementos m a n (inclusive) deben procesarse. ¿Cuántos elementos hay? Una respuesta intuitiva podría ser nm , pero hay un error de uno, lo que constituye un error de tipo "fencepost"; la respuesta correcta es nm + 1. Por esta razón, en informática, los rangos a menudo se representan mediante intervalos semiabiertos ; el rango de m a n (inclusive) se representa mediante el rango de m (inclusive) a n + 1 (exclusivo) para evitar errores de tipo "fencepost". Por ejemplo, un bucle que se ejecuta cinco veces (de 0 a  4 inclusive) se puede escribir como un intervalo semiabierto de 0 a  5:

for ( index = 0 ; index < 5 ; index ++ ) { /* Cuerpo del bucle */ }

El cuerpo del bucle se ejecuta primero con el índice igual a 0; luego, el índice toma los valores 1, 2, 3 y finalmente 4 en iteraciones sucesivas. En ese momento, el índice se convierte en 5, por lo que la condición índice < 5 es falsa y el bucle termina. Sin embargo, si la comparación utilizada fuera <= (menor o igual que), el bucle se ejecutaría seis veces: el índice tomaría los valores 0, 1, 2, 3, 4 y 5. Del mismo modo, si el índice se inicializara en 1 en lugar de 0, solo habría cuatro iteraciones: el índice tomaría los valores 1, 2, 3 y 4. Ambas alternativas pueden causar errores de índice.

Otro error similar puede ocurrir si se utiliza un bucle do-while en lugar de un bucle while (o viceversa). Un bucle do-while se ejecuta al menos una vez.

La confusión relacionada con los arreglos también puede deberse a diferencias en los lenguajes de programación. La numeración desde 0 es la más común, pero algunos lenguajes comienzan la numeración de arreglos con 1. Pascal cuenta con arreglos con índices definidos por el usuario. Esto permite modelar los índices del arreglo según el dominio del problema.

Implicaciones de seguridad

Un error común de desplazamiento de un byte que resulta en un fallo de seguridad se debe al uso incorrecto de la rutina de la biblioteca estándar de C.strncat Existe la idea errónea strncatde que la terminación nula garantizada no escribirá más allá de la longitud máxima. En realidad, escribirá un carácter nulo de terminación un byte más allá de la longitud máxima especificada. El siguiente código contiene dicho error:

void foo ( char * s ) { char buf [ 15 ]; memset ( buf , 0 , sizeof ( buf )); strncat ( buf , s , sizeof ( buf )); // El parámetro final debería ser: sizeof(buf)-1 }

Pueden producirse errores de desfase de uno al usar la biblioteca C porque no es consistente con respecto a si se necesita restar 1 byte; funciones como fgets()y strncpynunca escribirán más allá de la longitud que se les da ( fgets()se resta 1 a sí misma y solo recupera [ n − 1] bytes), mientras que otras, como strncat, sí escribirán más allá de la longitud que se les da. En algunos sistemas ( arquitecturas little endian en particular) este comportamiento puede resultar en la sobrescritura del byte menos significativo del puntero de marco . Esto puede causar una condición explotable en la que un atacante puede secuestrar las variables locales de la rutina que realiza la llamada.

Una estrategia que suele ayudar a evitar estos problemas consiste en utilizar variantes de estas funciones que calculan la cantidad de datos a escribir en función de la longitud total del búfer, en lugar del número máximo de caracteres a escribir. Entre estas funciones se incluyen strlcaty strlcpy, y suelen considerarse más seguras porque facilitan evitar la escritura accidental más allá del final del búfer. (En el ejemplo de código anterior, llamar a strlcat(buf, s, sizeof(buf))en su lugar eliminaría el error).

Véase también

Referencias

Citas

  1. Pollio, Marco Vitruvio. «Libro III, Capítulo 4, Párrafo 3». De Architectura [ Sobre la arquitectura ] . Traducido por Thayer, Bill.

Fuentes

  • Una versión anterior de este artículo se basó en un error de tipo de poste de valla en FOLDOC , utilizado con permiso .
  • Dijkstra, Edsger Wybe (2 de mayo de 2008). "Por qué la numeración debería comenzar en cero (EWD 831)" . Archivo EW Dijkstra . Universidad de Texas en Austin . Recuperado el 16 de marzo de 2011 .
  • En el sistema de enumeración de debilidades comunes , este problema se clasifica como CWE-193: Error de desfase de uno.

Lecturas adicionales

  • Parker, Matt (2021). Humble Pi: Cuando las matemáticas fallan en el mundo real . Riverhead Books. ISBN 978-0593084694.