En programación informática , un número mágico o constante mágica es un literal numérico en el código fuente cuyo significado no es claro para el lector. El término también se usa fuera de la programación para referirse a un número cuyo significado no es obvio sin conocimientos adicionales; por ejemplo, algunos formatos de archivo se identifican mediante un número mágico incrustado en el archivo . Asimismo, un número que está asociado de forma relativamente única con un concepto particular, como un identificador universalmente único , podría clasificarse como un número mágico.
Literal numérico
El uso de un número mágico en el código fuente se considera un antipatrón y rompe una de las reglas más antiguas de la programación, que se remonta a los manuales de COBOL , FORTRAN y PL/1 de la década de 1960. [ 1 ]
Por ejemplo, en el siguiente código que calcula un precio después de impuestos, 1.05es un número mágico ya que el valor codifica la tasa del impuesto sobre las ventas, 5%, de una manera que no es tan obvia.
precio_después_de_impuestos = 1,05 * precio
El uso de números mágicos en el código oculta la intención de los desarrolladores al elegir ese número, [ 2 ] aumenta las posibilidades de errores sutiles y dificulta la adaptación y extensión del programa en el futuro. [ 3 ] Por ejemplo, es difícil saber si cada dígito 3.14159265358979323846está escrito correctamente o si esta constante para pi se puede truncar sin 3.14159afectar la funcionalidad del programa debido a su precisión reducida. Reemplazar todos los números mágicos significativos con constantes con nombre (también llamadas variables explicativas) hace que los programas sean más fáciles de leer, comprender y mantener. [ 4 ]
El ejemplo anterior se puede mejorar añadiendo una variable con un nombre descriptivo:
IMPUESTO = 0,05 precio_después_de_impuestos = (1.0 + IMPUESTOS) * precio
Un buen nombre puede dar como resultado un código que sea más fácilmente comprendido por un mantenedor que no sea el autor original e incluso por el autor original después de un período de tiempo. [ 5 ] Un ejemplo de una constante con un nombre poco informativo es int SIXTEEN = 16, mientras que int NUMBER_OF_BITS = 16podría ser más útil.
Los datos no numéricos pueden tener las mismas propiedades mágicas y, por lo tanto, los mismos problemas que los números mágicos. [ 1 ] Por lo tanto, declarar const string testUserName = "John"y usar testUserNamepodría ser mejor que usar el literal "John"directamente.
Ejemplo
Por ejemplo, si se requiere barajar aleatoriamente los valores de una matriz que representa una baraja estándar de cartas , este pseudocódigo realiza la tarea utilizando el algoritmo de barajado de Fisher-Yates :
para i de 1 a 52 j := i + randomInt(53 - i) - 1 a.swapEntries(i, j)
donde aes un objeto de matriz, la función randomInt(x)elige un entero aleatorio entre 1 y x , ambos inclusive, e swapEntries(i, j)intercambia las entradas i y j52 de la matriz. En el ejemplo anterior, y 53son números mágicos, que tampoco están claramente relacionados entre sí. Se considera un mejor estilo de programación escribir lo siguiente:
int tamañoMazo:= 52 para i desde 1 hasta tamañoMazo j := i + randomInt(deckSize + 1 - i) - 1 a.swapEntries(i, j)
Esto es preferible por varias razones:
- Mayor legibilidad . Un programador que lea el primer ejemplo podría preguntarse: ¿Qué significa el número 52 aquí? ¿Por qué 52? El programador podría inferir el significado después de leer el código con atención, pero no es obvio. [ 5 ] Los números mágicos se vuelven particularmente confusos cuando el mismo número se usa para diferentes propósitos en una sección de código.
- Más fácil de mantener . Es más fácil alterar el valor del número, ya que no está duplicado. Cambiar el valor de un número mágico es propenso a errores, porque el mismo valor se usa a menudo varias veces en diferentes lugares dentro de un programa. [ 5 ] Además, cuando dos variables o números semánticamente distintos tienen el mismo valor, pueden editarse accidentalmente juntos. [ 5 ] Para modificar el primer ejemplo para barajar una baraja de Tarot , que tiene 78 cartas, un programador podría ingenuamente reemplazar cada instancia de 52 en el programa por 78. Esto causaría dos problemas. Primero, se omitiría el valor 53 en la segunda línea del ejemplo, lo que haría que el algoritmo fallara de forma sutil. Segundo, probablemente reemplazaría los caracteres "52" en todas partes, independientemente de si se refieren al tamaño de la baraja o a algo completamente distinto, como el número de semanas en un año del calendario gregoriano, o más insidiosamente, son parte de un número como "1523", todo lo cual introduciría errores. Por el contrario, cambiar el valor de la
deckSizevariable en el segundo ejemplo sería un cambio sencillo de una sola línea. - Fomenta la documentación . [ 5 ] El único lugar donde se declara la variable con nombre es un buen lugar para documentar qué significa el valor y por qué tiene ese valor. Tener el mismo valor en multitud de lugares lleva a comentarios duplicados (y los problemas consiguientes al actualizar algunos pero omitir otros) o no deja ningún lugar donde sea natural para el autor explicar el valor y donde probablemente el lector busque una explicación.
- Agrupa la información . Las declaraciones de variables de "número mágico" se pueden colocar juntas, generalmente al principio de una función o archivo, lo que facilita su revisión y modificación. [ 5 ]
- Detecta errores tipográficos . Usar una variable (en lugar de un literal) aprovecha la comprobación del compilador. Escribir accidentalmente "62" en lugar de "52" no se detectaría, mientras que escribir "
dekSize" en lugar de "deckSize" daría como resultado la advertencia del compilador de quedekSizeno está declarado. - Reduce la cantidad de escritura . Si un IDE admite la función de autocompletado de código , completará la mayor parte del nombre de la variable a partir de las primeras letras.
- Facilita la parametrización . Por ejemplo, para generalizar el ejemplo anterior a un procedimiento que baraje una baraja de cualquier número de cartas, bastaría con convertirlo
deckSizeen un parámetro de ese procedimiento, mientras que el primer ejemplo requeriría varios cambios.
función barajar ( int tamañoMazo) para i desde 1 hasta tamañoMazo j := i + randomInt(deckSize + 1 - i) - 1 a.swapEntries(i, j)
Las desventajas son:
- Rompe la localidad . Cuando una constante con nombre no se define cerca de su uso, perjudica la localidad y, por lo tanto, la comprensibilidad del código. Colocar el 52 en un lugar posiblemente distante significa que, para comprender completamente el funcionamiento del bucle "for" (por ejemplo, para estimar su tiempo de ejecución), hay que localizar la definición y verificar que sea el número esperado. Esto es fácil de evitar (reubicando la declaración) cuando la constante se usa solo en una parte del código. En cambio, cuando la constante con nombre se usa en partes dispares, la ubicación remota indica al lector que el mismo valor aparece en otros lugares del código, lo cual también puede ser relevante.
- Genera verbosidad . La declaración de la constante añade una línea. Cuando el nombre de la constante es más largo que su valor, sobre todo si aparecen varias constantes en una misma línea, puede ser necesario dividir una instrucción lógica del código en varias líneas. Un aumento en la verbosidad puede justificarse cuando existe la posibilidad de confusión respecto a la constante, o cuando existe la posibilidad de que sea necesario modificarla, como por ejemplo al reutilizar una rutina de barajado para otros juegos de cartas. También puede justificarse como una mejora en la expresividad.
- Consideraciones de rendimiento
deckSize + 1. El procesamiento de la expresión en tiempo de ejecución puede ser más lento que el del valor "53". Sin embargo, la mayoría de los compiladores modernos utilizan técnicas como la optimización de constantes y bucles para resolver la suma durante la compilación, por lo que la penalización en velocidad suele ser nula o insignificante en comparación con el uso de números mágicos en el código. En particular, el costo de la depuración y el tiempo necesario para comprender un código poco explicativo deben sopesarse frente al mínimo costo computacional.
Uso aceptado
Cuando un literal numérico carece de significado especial, su uso no se clasifica como mágico, aunque lo que constituye algo especial es subjetivo. Algunos ejemplos de literales que a menudo no se consideran mágicos son:
- Uso de 0 y 1 como valores iniciales o incrementales en un bucle for , como por ejemplo:
for(inti=0;i<max;i+=1)
- Se utiliza el operador 2 para comprobar si un número es par o impar, como en , donde es el operador módulo.
isEven = (x % 2 == 0)%
- Uso de literales simples, por ejemplo, en expresiones como
circumference = 2 * Math.PI * radius, [ 1 ] o para calcular el discriminante de una ecuación cuadrática comod = b^2 − 4*a*c
- Uso de potencias de 10 para convertir valores métricos (por ejemplo, entre gramos y kilogramos) o para calcular porcentajes y valores por mil.
- Exponentes en expresiones como
(f(x) ** 2 + f(y) ** 2) ** 0.5para
- Los literales 1 y 0 se utilizan a veces para representar los valores booleanos verdadero y falso. Sin embargo, podría ser mejor asignarles nombres como VERDADERO y FALSO.
- En C y C++, 0 se usa a menudo para referirse a un puntero nulo, aunque la biblioteca estándar de C define una macro
NULLy el C++ moderno incluye una palabra clavenullptr.
Indicador de formato
Origen
Los indicadores de formato se utilizaron por primera vez en las primeras versiones del código fuente de Unix (Versión 7) .
Unix se adaptó a uno de los primeros DEC PDP-11 /20, que no tenía protección de memoria . Por lo tanto, las primeras versiones de Unix usaban el modelo de referencia de memoria reubicable . [ 6 ] Las versiones de Unix anteriores a la Sexta Edición leían un archivo ejecutable en la memoria y saltaban a la primera dirección de memoria baja del programa, la dirección relativa cero. Con el desarrollo de las versiones paginadas de Unix, se creó una cabecera para describir los componentes de la imagen ejecutable . Además, se insertó una instrucción de salto como la primera palabra de la cabecera para omitirla e iniciar el programa. De esta manera, un programa podía ejecutarse en el modo de referencia de memoria reubicable (regular) anterior o en modo paginado. A medida que se desarrollaron más formatos ejecutables, se agregaron nuevas constantes incrementando el desplazamiento de salto . [ 7 ]
En el código fuente de la sexta edición del cargador de programas de Unix, la función exec() leía la imagen ejecutable ( binaria ) del sistema de archivos. Los primeros 8 bytes del archivo eran una cabecera que contenía los tamaños de las áreas de datos del programa (texto) e inicializadas (globales). Además, la primera palabra de 16 bits de la cabecera se comparaba con dos constantes para determinar si la imagen ejecutable contenía referencias de memoria reubicables (normal), la imagen ejecutable paginada de solo lectura recientemente implementada o la imagen paginada de instrucciones y datos separada. [ 8 ] No se mencionaba la doble función de la constante de la cabecera, pero el byte de orden superior de la constante era, de hecho, el código de operación para la instrucción de salto del PDP-11 ( octal 000407 o hexadecimal 0107). Si se sumaba siete al contador de programa, se indicaba que si se ejecutaba esta constante, se realizaría un salto en el servicio Unix exec() a través de la cabecera de ocho bytes de la imagen ejecutable y se iniciaría el programa.
Dado que la sexta y séptima edición de Unix empleaban código de paginación, la doble función de la constante de encabezado quedaba oculta. Es decir, el servicio exec() leía los datos de encabezado ( meta ) del archivo ejecutable en un búfer del espacio del kernel , pero leía la imagen ejecutable en el espacio de usuario , sin utilizar así la función de ramificación de la constante. La creación de números mágicos se implementó en el enlazador y el cargador de Unix , y la ramificación mediante números mágicos probablemente todavía se utilizaba en el conjunto de programas de diagnóstico independientes que venían con la sexta y séptima edición. Por lo tanto, la constante de encabezado sí proporcionaba una ilusión y cumplía los criterios para ser considerada mágica .
En la versión siete de Unix, la constante de encabezado no se probaba directamente, sino que se asignaba a una variable denominada ux_mag [ 9 ] y posteriormente se la conocía como el número mágico . Probablemente debido a su singularidad, el término número mágico pasó a significar tipo de formato ejecutable, luego se amplió para significar tipo de sistema de archivos, y se amplió nuevamente para significar cualquier tipo de archivo.
En archivos
Los números mágicos son comunes en programas de diversos sistemas operativos. Implementan datos fuertemente tipados y sirven como señalización interna para el programa controlador, que lee el tipo de datos durante la ejecución. Muchos archivos contienen constantes que identifican los datos que incluyen. Detectar estas constantes en los archivos es una forma sencilla y eficaz de distinguir entre diferentes formatos y puede proporcionar información adicional durante la ejecución .
- Ejemplos
- Los archivos de clase Java compilados ( bytecode ) y los binarios Mach-O comienzan con hexadecimal . Cuando se comprimen con Pack200, los bytes se cambian a .
CA FE BA BECA FE D0 0D - Los archivos de imagen GIF tienen el código ASCII para "GIF89a" ( ) o "GIF87a" ( ).
47 49 46 38 39 6147 49 46 38 37 61 - Los archivos de imagen JPEG comienzan con y terminan con . Los archivos JPEG/ JFIF contienen la cadena terminada en nulo "JFIF" ( ). Los archivos JPEG/ Exif contienen la cadena terminada en nulo "Exif" ( ), seguida de más metadatos sobre el archivo.
FF D8FF D94A 46 49 46 0045 78 69 66 00 - Los archivos de imagen PNG comienzan con una firma de 8 bytes que identifica el archivo como PNG y permite detectar problemas comunes de transferencia de archivos: "\211PNG\r\n\032\n" ( ). Esta firma contiene varios caracteres de salto de línea para permitir la detección de conversiones automáticas de salto de línea no justificadas, como la transferencia del archivo mediante FTP con el modo de transferencia ASCII en lugar del modo binario . [ 10 ]
89 50 4E 47 0D 0A 1A 0A - Los archivos de audio MIDI estándar tienen el código ASCII para "MThd" ( encabezado de pista MIDI ), seguido de más metadatos.
4D 54 68 64 - Los scripts de Unix o Linux pueden comenzar con un shebang ("#!", ) seguido de la ruta a un intérprete , si es probable que el intérprete sea diferente de aquel desde el que se invocó el script.
23 21 - Los ejecutables ELF comienzan con el byte
7Fseguido de "ELF" ( ).7F 45 4C 46 - Los archivos y programas PostScript comienzan con "%!" ( ).
25 21 - Los archivos PDF comienzan con "%PDF" (hexadecimal ).
25 50 44 46 - Los archivos ejecutables DOS MZ y el stub EXE de los archivos PE (Portable Executable) de Microsoft Windows comienzan con los caracteres "MZ" ( ), las iniciales del diseñador del formato de archivo, Mark Zbikowski . La definición también permite el poco común "ZM" ( ) para dosZMXP, un EXE que no es PE. [ 11 ]
4D 5A5A 4D - El formato de superbloque del sistema de archivos rápidos de Berkeley se identifica como o dependiendo de la versión; ambos representan el cumpleaños del autor, Marshall Kirk McKusick .
19 54 01 1901 19 54 - El registro de arranque maestro de los dispositivos de almacenamiento de arranque en casi todos los PC compatibles con IBM IA-32 tiene un código como sus dos últimos bytes.
55 AA - Los archivos ejecutables para las consolas portátiles Game Boy y Game Boy Advance tienen un número mágico de 48 o 156 bytes, respectivamente, en una posición fija del encabezado. Este número mágico codifica un mapa de bits del logotipo de Nintendo .
- Los archivos ejecutables Hunk de software de Amiga que se ejecutaban en las máquinas Amiga Classic 68000 comenzaban todos con el número hexadecimal $000003f3, apodado "Magic Cookie".
- En el Amiga, la única dirección absoluta del sistema es hexadecimal $0000 0004 (ubicación de memoria 4), que contiene la ubicación de inicio llamada SysBase, un puntero a exec.library, el llamado núcleo del Amiga.
- Los archivos PEF , utilizados por los ejecutables clásicos de Mac OS y BeOS para PowerPC , contienen el código ASCII de "¡Alegría!" ( ) como prefijo.
4A 6F 79 21 - Los archivos TIFF comienzan con "II" o "MM" seguido de 42 como un entero de dos bytes en orden de bytes little endian o big endian . "II" es para Intel, que usa el orden de bytes little endian , por lo que el número mágico es . "MM" es para Motorola, que usa el orden de bytes big endian , por lo que el número mágico es .
49 49 2A 004D 4D 00 2A - Los archivos de texto Unicode codificados en UTF-16 a menudo comienzan con la marca de orden de bytes para detectar el orden de bytes ( para big endian y para little endian). Y en Microsoft Windows , los archivos de texto UTF-8 a menudo comienzan con la codificación UTF-8 del mismo carácter, .
FE FFFF FEEF BB BF - Los archivos Bitcode de LLVM comienzan con "BC" ( ).
42 43 - Los archivos WAD comienzan con "IWAD" o "PWAD" (para Doom ), "WAD2" (para Quake ) y "WAD3" (para Half-Life ).
- Los archivos en formato binario de archivo compuesto de Microsoft (conocido principalmente como uno de los formatos más antiguos de documentos de Microsoft Office ) comienzan con , lo que sugiere visualmente la palabra "DOCFILE0".
D0 CF 11 E0 - Los encabezados en los archivos ZIP a menudo aparecen en los editores de texto como "PK♥♦" ( ), donde "PK" son las iniciales de Phil Katz , autor de la utilidad de compresión de DOS PKZIP .
50 4B 03 04 - Los encabezados en los archivos 7z comienzan con "7z" (número mágico completo: ).
37 7A BC AF 27 1C
- Detección
El programa de utilidad de Unix filepuede leer e interpretar números mágicos de archivos, y el archivo que se utiliza para analizar la información se llama magic . La utilidad de Windows TrID tiene un propósito similar.
En los protocolos
- Ejemplos
- El protocolo OSCAR , utilizado en AIM / ICQ , antepone a las solicitudes el prefijo
2A. - En el protocolo RFB utilizado por VNC , un cliente inicia su conversación con un servidor enviando "RFB" ( por "Remote Frame Buffer") seguido del número de versión del protocolo del cliente.
52 46 42 - En el protocolo SMB utilizado por Microsoft Windows, cada solicitud SMB o respuesta del servidor comienza con , o al inicio de la solicitud SMB.
FF 53 4D 42\xFFSMB - En el protocolo MSRPC utilizado por Microsoft Windows, cada solicitud basada en TCP comienza con
05al inicio de la solicitud (que representa la versión 5 de Microsoft DCE/RPC), seguido inmediatamente de un00o01para la versión menor. En las solicitudes MSRPC basadas en UDP, el primer byte siempre es04. - En las interfaces serializadas COM y DCOM , llamadas OBJREFs , siempre comienzan con la secuencia de bytes "MEOW" ( ). Las extensiones de depuración (utilizadas para la interceptación de canales DCOM) se preceden con la secuencia de bytes "MARB" ( ).
4D 45 4F 574D 41 52 42 - Las solicitudes de seguimiento de BitTorrent sin cifrar comienzan con un solo byte que contiene el valor
19que representa la longitud del encabezado, seguido inmediatamente por la frase "Protocolo BitTorrent" en la posición del byte 1. - El tráfico de eDonkey2000 / eMule comienza con un solo byte que representa la versión del cliente. Actualmente
E3representa un cliente eDonkey,C5representa eMule yD4representa eMule comprimido. - Los primeros 4 bytes de un bloque en la cadena de bloques de Bitcoin contienen un número mágico que sirve como identificador de red. El valor es , que indica la red principal, mientras que indica la red de prueba.
D9 B4 BE F9DA B5 BF FA - Las transacciones SSL siempre comienzan con un mensaje "client hello". El esquema de encapsulación de registros utilizado para anteponer a todos los paquetes SSL consta de encabezados de dos y tres bytes. Normalmente, un mensaje client hello de SSL versión 2 tiene como prefijo un
80y una respuesta del servidor SSLv3 a un client hello comienza con16(aunque esto puede variar). - Los paquetes DHCP utilizan un valor de "cookie mágica" al inicio de la sección de opciones del paquete. Este valor se incluye en todos los tipos de paquetes DHCP.
63 82 53 63 - Las conexiones HTTP/2 comienzan con la cadena de 24 caracteres . Está diseñada para evitar el procesamiento de tramas por parte de servidores e intermediarios que admiten versiones anteriores de HTTP pero no la 2.0.
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n - El protocolo de enlace de apertura de WebSocket utiliza una cadena que contiene el UUIDv4
258EAFA5-E914-47DA-95CA-C5AB0DC85B11.
En las interfaces
Los números mágicos son comunes en las funciones e interfaces de API en muchos sistemas operativos , incluidos DOS , Windows y NetWare :
- Ejemplos
- Las BIOS compatibles con IBM PC utilizan valores mágicos para decidir si el sistema debe contar la memoria o no al reiniciar, realizando así un arranque en frío o en caliente. Estos valores también son utilizados por los administradores de memoria EMM386 que interceptan las solicitudes de arranque. [ 12 ] Las BIOS también utilizan valores mágicos para determinar si un disco es arrancable. [ 13 ]
00 0012 3455 AA - La caché de disco de MS-DOS SMARTDRV (nombre en clave "Bambi") utiliza valores mágicos y en funciones API. [ 12 ]
BA BEEB AB - Muchos controladores de DR-DOS , Novell DOS y OpenDOS desarrollados en el antiguo Centro Europeo de Desarrollo en el Reino Unido utilizan el valor como token mágico al invocar o proporcionar funcionalidad adicional sobre las funciones estándar de DOS (emuladas), siendo NWCACHE un ejemplo. [ 12 ]
0E DC
Otros usos
- Ejemplos
- La dirección MAC predeterminada en los SOC de Texas Instruments es
DE:AD:BE:EF:00:00. [ 14 ]
GUID
Es posible crear o modificar identificadores únicos globales (GUID) para que sean fáciles de recordar, pero esto se desaconseja encarecidamente, ya que compromete su robustez como identificadores casi únicos. [ 15 ] [ 16 ] Las especificaciones para generar GUID y UUID son bastante complejas, lo que hace que sean prácticamente únicos, si se implementan correctamente. [ 17 ]
Los números de identificación de producto de Microsoft Windows para productos de Microsoft Office a veces terminan con 0000-0000-0000000FF1CE("OFFICE"), como por ejemplo 90160000-008C-0000-0000-0000000FF1CE, el ID de producto para el "Componente de extensibilidad de Office 16 Click-to-Run".
Java utiliza varios GUID que comienzan con CAFEEFAC. [ 18 ]
En la tabla de particiones GUID del esquema de particionamiento GPT, las particiones de arranque de la BIOS utilizan el GUID especial 21686148-6449-6E6F-744E-656564454649[ 19 ] que no sigue la definición de GUID; en su lugar, se forma utilizando los códigos ASCII para la cadena Hah!IdontNeedEFIparcialmente en orden little endian . [ 20 ]
Valor de depuración
Los valores de depuración mágicos son valores específicos que se escriben en la memoria durante la asignación o desasignación, de modo que posteriormente se pueda determinar si se han corrompido y para que sea evidente cuando se utilizan valores tomados de memoria no inicializada. La memoria se suele visualizar en hexadecimal, por lo que son comunes los valores repetitivos o hexadecimales fáciles de recordar . Se pueden preferir valores numéricamente impares para que los procesadores sin direccionamiento por bytes fallen al intentar usarlos como punteros (que deben estar en direcciones pares). Se deben elegir valores que estén lejos de las direcciones probables (el código del programa, los datos estáticos, los datos del montón o la pila). Del mismo modo, se pueden elegir de manera que no sean códigos válidos en el conjunto de instrucciones para la arquitectura dada.
Dado que es muy improbable, aunque posible, que un entero de 32 bits tome este valor específico, la aparición de dicho número en un depurador o volcado de memoria probablemente indica un error como un desbordamiento de búfer o una variable no inicializada .
Algunos ejemplos famosos y comunes son:
La mayoría de ellas tienen una longitud de 32 bits , que es el tamaño de palabra de la mayoría de los ordenadores con arquitectura de 32 bits.
La prevalencia de estos valores en la tecnología de Microsoft no es casualidad; se analizan en detalle en el libro de Steve Maguire , Writing Solid Code, publicado por Microsoft Press . En él, Maguire ofrece diversos criterios para estos valores, tales como:
- No deberían ser útiles; es decir, se esperaría que la mayoría de los algoritmos que operan con ellos hicieran algo inusual. Los números como el cero no cumplen este criterio.
- El programador debería poder reconocerlos fácilmente como valores no válidos en el depurador.
- En máquinas que no tienen alineación de bytes , deberían ser números impares , de modo que al intentar desreferenciarlos como direcciones se produzca una excepción.
- Si se ejecutan como código, deberían provocar una excepción, o incluso una interrupción del depurador.
Dado que a menudo se utilizaban para marcar áreas de memoria que estaban esencialmente vacías, algunos de estos términos llegaron a usarse en frases que significaban "desaparecido, abortado, borrado de la memoria"; por ejemplo, "Tu programa está MUERTO".
Véase también
- Valor de alerta temprana : técnicas de seguridad de software. Páginas que muestran breves descripciones de los objetivos de redirección.
- Tipo enumerado : conjunto con nombre de valores de tipo de datos
- Raíz cuadrada inversa rápida : algoritmo para encontrar raíces
- Número mágico : estructura de la información almacenada en un ordenador.
- FourCC – Identificador para un tipo de archivo
- Codificación fija : insertar datos en el código fuente de un programa.
- Hexspeak – Forma novedosa de ortografía variante del inglés
- Lista de firmas de archivos
- Magia (programación) : término que designa la abstracción en la programación informática.
- Cadena mágica : entrada que activa una funcionalidad que de otro modo estaría oculta.
- NaN – Valor para datos no representables
- Número sin secretos – Número de criptografía sin propiedades ocultas Páginas que muestran descripciones breves de destinos de redirección
- Valor centinela : valor de datos dentro de banda que debe ser procesado especialmente por el código informático.
- Errores de formato y almacenamiento de hora : una clase de errores de software.
- XYZZY (palabra mágica) – Término informático. Páginas que muestran descripciones breves de destinos de redireccionamiento.
Referencias
- 1 2 3 Martin, Robert C. (2009). «Capítulo 17: Olores y heurísticas - G25 Reemplazar números mágicos con constantes con nombre». Clean Code - Un manual de artesanía de software ágil . Boston: Prentice Hall. pág . 300. ISBN 978-0-13-235088-4.
- ↑ Martin, Robert C. (2009). «Capítulo 17: Olores y heurísticas - Intención oculta G16». Clean Code - Un manual de artesanía de software ágil . Boston: Prentice Hall. pág . 295. ISBN 978-0-13-235088-4.
- ↑ Maguire, James (09/12/2008). "Bjarne Stroustrup sobre la formación de desarrolladores de software" . Datamation.com . Archivado del original el 23/06/2018.
- ↑ Vogel, Jeff (29 de mayo de 2007). "Seis maneras de escribir código más comprensible" . IBM Developer . Archivado del original el 26 de septiembre de 2018.
- 1 2 3 4 5 6 Paul, Matthias R. (2002-04-09). " [ fd-dev ] CuteMouse 2.0 alpha 1" . freedos-dev . Archivado del original el 2022-04-07 . Recuperado el 2022-08-04 .
- ↑ "Comentarios extraños y sucesos raros en Unix" . Bell Labs . 22 de junio de 2002. Archivado del original el 4 de noviembre de 2006.
- ↑ Comunicación personal con Dennis M. Ritchie.
- ↑ "El árbol Unix V6/usr/sys/ken/sys1.c" . La Sociedad del Patrimonio Unix . Archivado del original el 26 de marzo de 2023.
- ↑ "El árbol Unix V7/usr/sys/sys/sys1.c" . La Sociedad del Patrimonio Unix . Archivado del original el 26 de marzo de 2023.
- ↑ "Especificación PNG (Portable Network Graphics) Versión 1.0: 12.11. Firma de archivo PNG" . MIT . 1996-10-01. Archivado del original el 2023-03-26.
- ↑ Chen, Raymond (24 de marzo de 2008). "¿Cuál es la diferencia entre las extensiones COM y EXE?" . The Old New Thing . Archivado del original el 18 de febrero de 2019.
- 1 2 3 Paul, Matthias R. (2002-04-03). " [ fd-dev ] Ctrl+Alt+Del" . freedos-dev . Archivado del original el 10-05-2017 . Recuperado el 09-09-2017 .(Nota: Se mencionan varios valores mágicos utilizados por las BIOS compatibles con IBM PC (0000h, 1234h), los gestores de memoria de DOS como EMM386 (1234h) y las cachés de disco como SMARTDRV (EBABh, BABEh) y NWCACHE (0EDCh, EBABh, 6756h).)
- ↑ "El proceso de arranque BIOS/MBR" . Base de conocimientos de NeoSmart . 25/01/2015. Archivado del original el 26/03/2023 . Consultado el 03/02/2019 .
- ↑ "Comunidad TI E2E: ¿Alguien sabe si las siguientes configuraciones se pueden realizar con la herramienta CLI de MCP?" . Texas Instruments . 27/08/2011. Archivado del original el 07/10/2022.
- ↑ Newcomer, Joseph M. (13 de octubre de 2001). "Gestión de mensajes: garantizando la unicidad" . Developer Fusion . Archivado del original el 21 de abril de 2005. Consultado el 16 de noviembre de 2007 .
- ↑ Osterman, Larry (21 de julio de 2005). "Los UUID solo son únicos si los generas..." Blog de Larry Osterman: Confesiones de un viejo carcamal . MSDN. Archivado del original el 28 de marzo de 2023. Consultado el 16 de noviembre de 2007 .
- ↑ "RFC 9562 - Identificadores Universalmente Únicos (UUID)" . ietf.org . Mayo de 2024. Consultado el 9 de agosto de 2024 .
- ↑ "Implementación de applets de Java con versiones de JRE de la familia en el complemento de Java para Internet Explorer" . Oracle . Archivado del original el 30/11/2022 . Consultado el 28/03/2023 .
- ↑ "Instalación de GNU GRUB, Sección 3.4: Instalación de BIOS" . Gnu.org . Archivado del original el 15 de marzo de 2023. Consultado el 26 de junio de 2014 .
- ↑ Heddings, Lowell (3 de noviembre de 2014). "Números mágicos: los códigos secretos que los programadores ocultan en tu PC" . How-To Geek . Archivado del original el 26 de marzo de 2023. Consultado el 3 de octubre de 2017 .
- ↑ Cavit, Doug (24 de abril de 2012). "Protección contra la reutilización de referencias de objetos obsoletas" . Microsoft Secure . Archivado del original el 26 de julio de 2018. Consultado el 26 de julio de 2018 .
- ↑ Boleyn, Erich Stefan (4 de abril de 1995). "Comentarios sobre la propuesta del 'Estándar MultiBoot'" . Uruk.org . Archivado del original el 26 de marzo de 2023.
- 1 2 3 4 5 6 "Nota técnica TN2151: Comprensión y análisis de informes de fallos de aplicaciones" . Documentación para desarrolladores de Apple . 29/01/2009. Archivado del original el 13/12/2018.
- 1 2 3 4 5 6 Birkett, Andrew. "Win32 Debug CRT Heap Internals" . Nobugs.org .
- ↑ McNamara, Paul (19 de julio de 2012). "El código de Microsoft contiene la frase 'tetas grandes'... Sí, de verdad" . Network World .
- ↑ WebKit , El proyecto de código abierto WebKit, 6 de enero de 2023 , consultado el 6 de enero de 2023
- ↑ "AddressSanitizer - Preguntas frecuentes" . GitHub . Consultado el 18 de mayo de 2022 .
- ↑ "MANUAL DE REFERENCIA DEL PROGRAMADOR INTEL 80386" . MIT .
- ↑ Scheppner, Carolyn. "Guía de Amiga Mail Vol.2" . Cataclysm.cx . Archivado del original el 18 de julio de 2011. Consultado el 20 de agosto de 2010 .
- ↑ "Error de comprobación 0xDEADDEAD MANUALLY_INITIATED_CRASH1" . Documentación de Microsoft . 19 de junio de 2023.
- ↑ "Safari versión 14.0.1 se cierra inesperadamente" .
- ↑ "Especificación del árbol de dispositivos" .
- ↑ "strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l" . Documentación de Microsoft . Consultado el 16 de enero de 2019 .
- Antipatrones
- Depuración
- Folclore de la programación informática
- Folclore de la ingeniería de software