stringtranslate.com

Error uno por uno

Un error de uno por uno o error de uno por uno (conocido por las siglas OBOE , OBO , OB1 y OBOB ) es un error lógico que involucra un número que difiere de su valor previsto en +1 o −1. A menudo ocurre en programación de computadoras cuando un bucle se repite demasiadas o muy pocas veces, generalmente causado por el uso de desigualdad no estricta (≤) como condición final donde debería haberse usado la desigualdad estricta (<), o viceversa. Los errores uno por uno también surgen de la confusión sobre la numeración basada en cero . A veces puede aparecer un error de uno en uno en un contexto matemático .

Casos

Recorriendo matrices

Considere una serie de elementos, y los elementos del m al n (inclusive) deben procesarse. ¿Cuántos artículos hay? Una respuesta intuitiva puede ser nm , pero está equivocada en uno, lo que muestra un error de valla; la respuesta correcta es nm + 1 .

Por esta razón, los rangos en informática suelen representarse mediante intervalos medio abiertos ; el rango de m an ( inclusive ) está representado por el rango de m (inclusive) a n + 1 (exclusivo) para evitar errores en los postes de la cerca. Por ejemplo, un bucle que se repite cinco veces (de 0 a 4 inclusive) se puede escribir como un intervalo medio abierto de 0 a 5:

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

El cuerpo del bucle se ejecuta en primer lugar con un índice igual a 0; El índice luego se convierte en 1, 2, 3 y finalmente 4 en iteraciones sucesivas. En ese punto, el índice pasa a ser 5, por lo que el índice < 5 es falso y el ciclo finaliza. Sin embargo, si la comparación utilizada fuera <= (menor o igual a), el bucle se realizaría seis veces: índice toma los valores 0, 1, 2, 3, 4 y 5. Asimismo, si índice se inicializara a 1 en lugar de 0, solo habría cuatro iteraciones: el índice toma los valores 1, 2, 3 y 4. Ambas alternativas pueden provocar errores uno por uno.

Otro error similar puede ocurrir si se usa un bucle do- while en lugar de un bucle while (o viceversa). Se garantiza que un bucle do- while se ejecutará al menos una vez.

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

Error de poste de cerca

Un error de poste de cerca (ocasionalmente llamado error de poste de telégrafo, poste de luz o cerca ) es un tipo específico de error de uno en 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 espaciados a 3 pies de distancia, ¿cuántos postes necesitas?

Una valla recta con 10 secciones requiere 11 postes. De manera más general, n secciones requerirían n + 1 publicaciones.

La respuesta común de 10 publicaciones es incorrecta. Esta respuesta surge de dividir la longitud de la cerca por el espacio entre cada poste, clasificándose erróneamente el cociente como el número de postes. En la actualidad, la valla tiene 10 tramos y 11 postes.

En este escenario, una valla con n secciones tendrá n + 1 postes. Por el contrario, si la cerca contiene n postes, contendrá n − 1 secciones. Es importante considerar esta relación cuando se trata del error inverso. El error inverso ocurre cuando se conoce el número de publicaciones y se supone que el número de secciones es el mismo. Dependiendo del diseño de la valla, 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 valla cambia 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 espacios de paso), n si la cerca forma uno completo, bucle independiente (p. ej., recinto accesible superando, como un ring de boxeo), o n + 1 si los postes no se encuentran en los extremos de una cerca similar a un segmento de línea (p. ej., una cerca entre y anclada a la pared a dos edificios). 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 situaciones. Los errores de los postes de cerca provienen de contar cosas en lugar de los espacios entre ellas, o viceversa, o de no considerar si se deben contar uno o ambos extremos de una fila.

Los errores de postes de cerca 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 bloques, está previsto que tarde 1.190 años en construirse (no 1.200), desde la instalación del primer bloque hasta el último. Uno de los primeros errores tuvo que ver con el tiempo, ya que el calendario juliano originalmente calculaba incorrectamente los años bisiestos , debido a que contaba de manera inclusiva en lugar de exclusiva, lo que arrojaba un año bisiesto cada tres años en lugar de cada cuatro.

"Error de valla" puede, en raras ocasiones, referirse a un error inducido por regularidades inesperadas en los valores de entrada, [2] que pueden (por ejemplo) frustrar por completo una implementación teóricamente eficiente de un árbol binario o de una función hash . Este error implica la diferencia entre el comportamiento esperado y el peor de los casos de un algoritmo .

En números más grandes, estar desviado por uno no suele ser un problema importante. Sin embargo, en números más pequeños y en casos específicos donde la precisión es primordial, cometer un error de uno en uno puede ser desastroso. A veces, este problema también se repetirá y, por lo tanto, empeorará si alguien realiza un cálculo incorrecto, si la siguiente persona vuelve a cometer el mismo tipo de error (por supuesto, el error también podría revertirse).

Un ejemplo de este error puede ocurrir en el lenguaje computacional MATLAB con la función linspace() de interpolación lineal , cuyos parámetros son y no . Un programador que malinterprete el tercer parámetro como el número de incrementos podría esperar que lograra una secuencia , pero en lugar de eso 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]

Implicaciones de seguridad

Un error común de uno en uno que resulta en un error relacionado con la seguridad es causado por el mal uso de la rutina de la biblioteca estándar de C. strncat Un error común strncates 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 , tamaño de ( buf )); strncat ( buf , s , tamaño de ( buf )); // El parámetro final debe ser: sizeof(buf)-1 }             

Los errores de uno por uno son comunes al usar la biblioteca C porque no es consistente con respecto a si es necesario restar 1 byte: funciones como fgets()and strncpynunca escribirán más allá de la longitud dada ( fgets()resta 1 y solo recupera (longitud − 1) bytes), mientras que otros, como, strncatescribirán más allá de la longitud dada. Entonces el programador debe recordar para qué funciones necesita restar 1.

En algunos sistemas ( arquitecturas little endian en particular), esto puede provocar la sobrescritura del byte menos significativo del puntero de trama . Esto puede provocar una condición explotable en la que un atacante puede secuestrar las variables locales para la rutina de llamada.

Un enfoque que a menudo ayuda a evitar estos problemas es utilizar variantes de estas funciones que calculan cuánto escribir en función de la longitud total del búfer, en lugar del número máximo de caracteres a escribir. Estas funciones incluyen strlcaty strlcpy, y a menudo se consideran "más seguras" porque facilitan evitar escribir accidentalmente más allá del final de un búfer. (En el ejemplo de código anterior, llamar strlcat(buf, s, sizeof(buf))eliminaría el error).

Ver también

Referencias

Citas

  1. ^ Moniot, Robert K., ¿Quién describió por primera vez el "error del poste de la cerca?", Universidad de Fordham , archivado desde el original el 5 de marzo de 2016 , consultado el 7 de julio de 2016.
  2. ^ Raymond, Eric. "El archivo de la jerga" . Consultado el 17 de mayo de 2021 .

Fuentes

Otras lecturas