Número mágico (programación)
En programación informática, un número mágico es cualquiera de los siguientes:
- Un valor único con significado no explicado o múltiples ocurrencias que podrían (preferiblemente) ser reemplazadas por una constante llamada
- Un valor numérico o texto constante utilizado para identificar un formato de archivo o protocolo; para archivos, vea Lista de firmas de archivos
- Un valor único distintivo que es poco probable que se equivoque por otros significados (por ejemplo, Identificadores Globalmente Únicos)
Constantes numéricas sin nombre
El término número mágico o constante mágica se refiere al antipatrón de usar números directamente en el código fuente. código. Se ha dicho que esto es romper una de las reglas de programación más antiguas, que se remonta a los manuales COBOL, FORTRAN y PL/1 de la década de 1960. El uso de números mágicos sin nombre en el código oscurece la visión de los desarrolladores. La intención al elegir ese número, aumenta las oportunidades de errores sutiles (por ejemplo, ¿es correcto cada dígito en 3.14159265358979323846 y es igual a 3.14159?) y hace que sea más difícil adaptar y ampliar el programa en el futuro. 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.
Los nombres elegidos para que sean significativos en el contexto del programa pueden dar como resultado un código que sea más fácil de entender para un mantenedor que no sea el autor original (o incluso para el autor original después de un período de tiempo). Un ejemplo de una constante con un nombre no informativo es int SIXTEEN = 16
, mientras que int NUMBER_OF_BITS = 16
es más descriptivo.
Los problemas asociados con los 'números' Los términos descritos anteriormente no se limitan a tipos numéricos y el término también se aplica a otros tipos de datos donde declarar una constante con nombre sería más flexible y comunicativo. Por lo tanto, declarar const string testUserName = "John"
es mejor que varias apariciones del 'valor mágico' "John"
en un conjunto de pruebas.
Por ejemplo, si es necesario mezclar aleatoriamente los valores en una matriz que representa una baraja de naipes estándar, este pseudocódigo hace el trabajo utilizando el algoritmo de barajado de Fisher-Yates:
para i desde 1 a 52 j:= i + randomInt(53 - i) - 1 a.swapEntries(i, j)
donde a
es un objeto de matriz, la función randomInt(x)
elige un entero aleatorio entre 1 y x, inclusive, y swapEntries(i, j)
intercambia las entradas iésima y jésima de la matriz. En el ejemplo anterior, 52
es un número mágico. Se considera un mejor estilo de programación escribir lo siguiente:
constante int DECK_SIZE:= 52 para i desde 1 a DECK_SIZE j:= i + randomInt(DECK_SIZE + 1 - i) - 1 a.swapEntries(i, j)
Esto es preferible por varias razones:
- Es más fácil leer y comprender. Un programador leyendo 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 cuidadosamente, pero no es obvio. Los números mágicos se vuelven particularmente confusos cuando el mismo número se utiliza para diferentes propósitos en una sección de código.
- Es más fácil modificar el valor del número, ya que no se duplica. Cambiar el valor de un número mágico es propensa al error, porque el mismo valor se utiliza varias veces en diferentes lugares dentro de un programa. Además, cuando dos variables o números semánticamente distintos tienen el mismo valor que pueden ser accidentalmente ambos editados juntos. Para modificar el primer ejemplo para eliminar una cubierta de Tarot, que tiene 78 tarjetas, un programador podría reemplazar ingenuamente cada instancia de 52 en el programa con 78. Esto causaría dos problemas. En primer lugar, perdería el valor 53 en la segunda línea del ejemplo, lo que haría que el algoritmo fallara de una manera sutil. En segundo lugar, probablemente reemplazaría a los personajes "52" en todas partes, independientemente de si se refieren al tamaño de la cubierta o a algo más por completo, como el número de semanas en un año civil gregoriano, o más insidios, son parte de un número como "1523", todo lo cual introduciría errores. Por contraste, cambiando el valor del
deckSize
variable en el segundo ejemplo sería un cambio simple de una línea. - Alienta y facilita la documentación. El único lugar donde se declara la variable nombrada hace un buen lugar para documentar lo que significa el valor y por qué tiene el valor que hace. Tener el mismo valor en una plétora de lugares o bien conduce a comentarios duplicados (y problemas adjuntos cuando se actualizan algunos pero faltan algunos) o deja no uno lugar donde es natural para el autor explicar el valor y probablemente el lector buscará una explicación.
- Las declaraciones de variables "número mágico" se colocan juntas, generalmente en la parte superior de una función o archivo, facilitando su revisión y cambio.
- Ayuda a detectar los tipos. Utilizar una variable (en lugar de un literal) aprovecha la comprobación de un compilador. El escribir accidentalmente "62" en lugar de "52" no sería detectado, mientras que escribir "
dekSize
"en vez de "deckSize
" daría lugar a la advertencia del compilador de quedekSize
no está declarado. - Puede reducir la escritura en algunos IDE. Si un IDE admite la terminación del código, rellenará la mayor parte del nombre de la variable de las primeras letras.
- Facilita la parametrización. Por ejemplo, para generalizar el ejemplo anterior en un procedimiento que sacude una cubierta de cualquier número de tarjetas, sería suficiente convertir
deckSize
en un parámetro de ese procedimiento, mientras que el primer ejemplo requeriría varios cambios.
función shuffleint deckSize) para i desde 1 a deckSize J:= i + aleatorio Int(deckSize + 1 - i) - 1 a.swapEntries(i, j)
Las desventajas son:
- Cuando la constante no se define cerca de su uso, hace daño a la localidad, y por lo tanto la comprensión, del código. Poner el 52 en un lugar posiblemente distante significa que, para entender el funcionamiento del bucle "por" completamente (por ejemplo, para estimar el tiempo de ejecución del bucle), se debe rastrear la definición y verificar que es el número esperado. Esto es fácil de evitar (por reubicar la declaración) cuando la constante sólo se utiliza en una parte del código. Cuando la constante nombrada se utiliza en partes dispares, por otro lado, la ubicación remota es una pista para el lector de que el mismo valor aparece en otros lugares del código, que también puede valer la pena mirar en.
- Puede hacer el código más verbose. La declaración de la constante añade una línea. Cuando el nombre de la constante es más largo que el del valor, sobre todo si varias constantes aparecen en una línea, puede hacer necesario dividir una declaración lógica del código en varias líneas. Un aumento de la verbosidad puede justificarse cuando hay cierta probabilidad de confusión acerca de la constante, o cuando hay una probabilidad de que la constante pueda necesitar ser cambiada, como la reutilización de una rutina de amortiguación para otros juegos de cartas. También puede justificarse como un aumento de la expresividad.
- Puede ser más lento procesar la expresión
deckSize + 1
en tiempo de ejecución que el valor "53", aunque la mayoría de los compiladores e intérpretes modernos notarán quedeckSize
ha sido declarado como constante y pre-calculado el valor 53 en el código compilado. Incluso cuando esa no es una opción, la optimización del bucle moverá la adición para que se realice antes del bucle. Por lo tanto, generalmente no hay (o insignificante) penalización de velocidad en comparación con el uso de números mágicos en código. Especialmente el costo de depuración y el tiempo necesario para tratar de entender el código no explicativo debe ser sostenido contra el pequeño costo de cálculo.
Usos aceptados
En algunos contextos, el uso de constantes numéricas sin nombre es generalmente aceptado (y podría decirse que "no es mágico"). Si bien dicha aceptación es subjetiva y a menudo depende de los hábitos de codificación individuales, los siguientes son ejemplos comunes:
- el uso de 0 y 1 como valores iniciales o incrementales en un bucle, como
for (int i = 0; i < max; i += 1)
- el uso de 2 para comprobar si un número es uniforme o extraño, como en
isEven = (x % 2 == 0)
, donde%
es el operador de modulo - el uso de constantes aritméticas simples, por ejemplo, en expresiones como
circumference = 2 * Math.PI * radius
, o para calcular el discriminante de una ecuación cuadrática comod = b^2 − 4*a*c
- el uso de poderes de 10 para convertir valores métricos (por ejemplo, entre gramos y kilogramos) o para calcular porcentaje y valores por milla
- exponentes en expresiones como
(f(x) ** 2 + f(y) ** 2) ** 0.5
para f()x)2+f()Sí.)2{fnMicrosoft Sans Serif}}
Las constantes 1 y 0 se utilizan a veces para representar los valores booleanos Verdadero y Falso en lenguajes de programación sin un tipo booleano, como las versiones anteriores de C. La mayoría de los lenguajes de programación modernos proporcionan un booleano o bool
tipo primitivo y por lo tanto el uso de 0 y 1 no es aconsejable. Esto puede resultar más confuso ya que 0 a veces significa éxito programático (cuando -1 significa fracaso) y fracaso en otros casos (cuando 1 significa éxito).
En C y C++, 0 representa el puntero nulo. Al igual que con los valores booleanos, la biblioteca estándar de C incluye una definición de macro NULL
cuyo uso se recomienda. Otros idiomas proporcionan un valor null
o nil
específico y, cuando este es el caso, no se debe utilizar ninguna alternativa. La constante de puntero escrita nullptr
se introdujo con C++11.
Indicadores de formato
Origen
Los indicadores de formato se utilizaron por primera vez en las primeras versiones del código fuente de Unix.
Unix fue portado a uno de los primeros DEC PDP-11/20, que no tenía protección de memoria. Por eso, las primeras versiones de Unix utilizaban el modelo de referencia de memoria reubicable. Las versiones Unix anteriores a la sexta edición leen un archivo ejecutable en la memoria y saltan a la primera dirección de memoria baja del programa, la dirección relativa cero. Con el desarrollo de versiones paginadas de Unix, se creó un encabezado para describir los componentes de la imagen ejecutable. Además, se insertó una instrucción de bifurcación como primera palabra del encabezado para omitir el encabezado e iniciar el programa. De esta manera, un programa podría ejecutarse en el modo (normal) de referencia de memoria reubicable anterior o en modo paginado. A medida que se desarrollaron más formatos ejecutables, se agregaron nuevas constantes incrementando el desplazamiento de la rama.
En el código fuente de la sexta edición del cargador de programas Unix, la función exec() lee la imagen ejecutable (binaria) del sistema de archivos. Los primeros 8 bytes del archivo eran un encabezado que contenía los tamaños del programa (texto) y las áreas de datos inicializadas (globales). Además, la primera palabra de 16 bits del encabezado se comparó 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 separados. No se mencionó la doble función de la constante de encabezado, pero el byte de orden superior de la constante era, de hecho, el código de operación para la instrucción de bifurcación PDP-11 (octal 000407 o hexadecimal 0107). Agregar siete al contador del programa mostró que si se ejecutaba esta constante, bifurcaría el servicio Unix exec() sobre el encabezado de ocho bytes de la imagen ejecutable e iniciaría el programa.
Dado que las ediciones sexta y séptima de Unix empleaban código de paginación, la doble función de la constante de encabezado estaba oculta. Es decir, el servicio exec() lee los datos del encabezado (meta) del archivo ejecutable en un búfer de espacio del kernel, pero lee la imagen ejecutable en el espacio del usuario, por lo que no utiliza la función de ramificación de la constante. La creación de números mágicos se implementó en el enlazador y cargador de Unix y la ramificación de números mágicos probablemente todavía se usaba en el conjunto de programas de diagnóstico independientes que venían con las ediciones sexta y séptima. Por lo tanto, la constante de cabeza proporcionó una ilusión y cumplió con los criterios de magia.
En la versión siete de Unix, la constante del encabezado no se probó directamente, sino que se asignó a una variable denominada ux_mag y posteriormente se la denominó 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 expandió para significar tipo de sistema de archivos y se expandió nuevamente para significar cualquier tipo de archivo.
En archivos
Los números mágicos son comunes en programas de muchos sistemas operativos. Los números mágicos implementan datos fuertemente tipados y son una forma de señalización dentro de banda para el programa de control que lee los tipos de datos en tiempo de ejecución del programa. Muchos archivos tienen constantes que identifican los datos contenidos. Detectar este tipo de constantes en archivos es una forma sencilla y eficaz de distinguir entre muchos formatos de archivos y puede proporcionar más información en tiempo de ejecución.
- Ejemplos
- Los archivos de clase Java (bytecode) y los binarios Mach-O comienzan con hex
CAFEBABE
. Cuando se comprimen con Pack200 los bytes se cambianCAFED00D
. - Los archivos de imagen GIF tienen el código ASCII para "GIF89a" ()
47
49
46
38
39
61
o "GIF87a" ()47
49
46
38
37
61
) - Los archivos de imagen JPEG comienzan con
FF
D8
y terminar conFF
D9
. Los archivos JPEG/JFIF contienen la cadena null terminada "JFIF" (JFIF)4A
46
49
46
00
). Los archivos JPEG/Exif contienen la cadena null terminada "Exif" (Exif)45
78
69
66
00
), seguido de más metadatos sobre el archivo. - Los archivos de imagen PNG comienzan con una firma de 8 bytes que identifica el archivo como un archivo PNG y permite la detección de problemas comunes de transferencia de archivos: "211PNGrn32n" ()
89
50
4E
47
0D
0A
1A
0A
). Esa firma contiene varios caracteres de nueva línea para permitir la detección de conversiones automatizadas de nueva línea injustificadas, tales como transferir el archivo utilizando FTP con el ASCII modo de transferencia en lugar del binario Modo. - Los archivos de audio MIDI estándar tienen el código ASCII para "MThd" (MIDI Track headEh...
4D
54
68
64
) seguido de más metadatos. - Los scripts Unix o Linux pueden comenzar con un shebang ("#!",
23
21
) seguido por el camino a un intérprete, si es probable que el intérprete sea diferente del que se invocó el guión. - ELF ejecutables comienzan con el byte
7F
seguido de "ELF"7F
45
4C
46
). - Los archivos y programas PostScript comienzan con "%!" ()
25
21
). - Los archivos PDF comienzan con "%PDF" (hex
25
50
44
46
). - Los archivos ejecutables DOS MZ y el stub EXE de los archivos de Microsoft Windows PE (Portable Executable) comienzan con los caracteres "MZ" (MZ)
4D
5A
), las iniciales del diseñador del formato de archivo, Mark Zbikowski. La definición permite el "ZM" poco común5A
4D
También para dosZMXP, un EXE no-PE. - El formato de superblock del sistema de archivos rápido de Berkeley se identifica como
19
54
01
19
o01
19
54
dependiendo de la versión; ambos representan el cumpleaños del autor, Marshall Kirk McKusick. - The Master Boot Record of bootable storage devices on almost all IA-32 IBM PC compatibles tiene un código de
55
AA
como sus últimos dos bytes. - Los sistemas de videojuegos portátiles Game Boy y Game Boy Advance tienen un número mágico de 48 o 156 bytes, respectivamente, en un lugar fijo en el encabezado. Este número mágico codifica un bitmap del logotipo de Nintendo.
- Los archivos de software de Amiga ejecutables Hunk en las máquinas de Amiga clásica 68000 comenzaron con el número hexadecimal $000003f3, apodado el "Galleta Mágica".
- En el Amiga, la única dirección absoluta en el sistema es hex $0000 0004 (memory location 4), que contiene la ubicación inicial llamada SysBase, un puntero a la exec.library, el llamado núcleo de Amiga.
- Los archivos PEF, utilizados por el clásico Mac OS y BeOS para ejecutables PowerPC, contienen el código ASCII para "Joy!" ()
4A
6F
79
21
Como prefijo. - Los archivos TIFF comienzan con "II" o "MM" seguidos por 42 como un entero de dos bytes en pequeñas o grandes órdenes de byte endian. "II" es para Intel, que utiliza poco orden de byte endiano, por lo que el número mágico es
49
49
2A
00
. "MM" es para Motorola, que utiliza gran orden de byte endiano, por lo que el número mágico es4D
4D
00
2A
. - Archivos de texto Unicode codificados en UTF-16 a menudo comienzan con la marca Byte Order para detectar endianness (
FE
FF
para grandes endian yFF
FE
para el pequeño endian). Y en Microsoft Windows, los archivos de texto UTF-8 a menudo comienzan con la codificación UTF-8 del mismo carácter,EF
BB
BF
. - LLVM Los archivos Bitcode comienzan con "BC" (BC)
42
43
). - Los archivos WAD comienzan con "IWAD" o "PWAD" (para Doom"WAD2" Quake"WAD3" Media vida).
- Microsoft Compound File Binary Format (la mayoría conocida como uno de los formatos más antiguos de documentos de Microsoft Office)
D0
CF
11
E0
, que es visualmente sugestivo de la palabra "DOCFILE0". - Los encabezados en archivos ZIP suelen aparecer en editores de texto como "PK♥♦" ()
50
4B
03
04
), donde "PK" son las iniciales de Phil Katz, autor de la utilidad de compresión DOS PKZIP. - Los encabezados en archivos 7z comienzan con "7z" (número completo de magia:
37
7A
BC
AF
27
1C
).
- Detección
El programa de utilidad Unix file
puede 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 TrID de Windows tiene un propósito similar.
En protocolos
- Ejemplos
- El protocolo OSCAR, utilizado en AIM/ICQ, prefijo solicitudes con
2A
. - En el protocolo RFB utilizado por VNC, un cliente inicia su conversación con un servidor enviando "RFB" (RFB)
52
46
42
, para "Remote Frame Buffer") seguido por el número de versión del protocolo del cliente. - En el protocolo SMB utilizado por Microsoft Windows, cada solicitud SMB o respuesta del servidor comienza con '
FF
53
4D
42
', o"xFFSMB"
al comienzo de la solicitud del SMB. - En el protocolo MSRPC utilizado por Microsoft Windows, cada solicitud basada en TCP comienza con
05
al comienzo de la solicitud (representando Microsoft DCE/RPC Versión 5), seguida inmediatamente por un00
o01
para la versión menor. En UDP MSRPC pide el primer byte es siempre04
. - En COM y DCOM marshalled interfaces, llamadas OBJREFs, siempre comienzan con la secuencia byte "MEOW" (MEOW)
4D
45
4F
57
). Las extensiones de depuración (utilizadas para la conexión del canal DCOM) están prefabricadas con la secuencia de byte "MARB" (4D
41
52
42
). - Las solicitudes de rastreador BitTorrent no cifradas comienzan con un solo byte que contiene el valor
19
representando la longitud del encabezado, seguido inmediatamente por la frase "Protocolo de inicio" en posición de byte 1. - eDonkey2000/eMule traffic starts with a single byte representing the client version. Actualmente
E3
representa un cliente de eDonkey,C5
representa eMule, yD4
representa eMule comprimido. - Los primeros 4 bytes de un bloque en el Bloque de Bitcoin contienen un número mágico que sirve como identificador de red. El valor es una constante
0xD9B4BEF9
, que indica la red principal, mientras que la constante0xDAB5BFFA
indica el testnet. - Las transacciones SSL siempre comienzan con un mensaje "hola cliente". El esquema de encapsulación récord utilizado para prefijar todos los paquetes SSL consiste en formas de encabezado de dos y tres bytes. Típicamente una versión SSL 2 cliente mensaje de hola está prefijado con un
80
y una respuesta del servidor SSLv3 a un cliente hola comienza con16
(aunque esto puede variar). - Los paquetes DHCP usan un valor de "cookie mágica" de '
0x63
0x82
0x53
0x63
' al comienzo de la sección de opciones del paquete. Este valor se incluye en todos los tipos de paquetes DHCP. - Las conexiones HTTP/2 se abren con el prefacio '
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
', o "PRI * HTTP/2.0rnrnSMrnrn
". El prefacio está diseñado para evitar el procesamiento de marcos por servidores e intermediarios que soportan versiones anteriores de HTTP pero no 2.0.
En interfaces
Los números mágicos son comunes en las funciones e interfaces API de muchos sistemas operativos, incluidos DOS, Windows y NetWare:
- Ejemplos
- IBM PC-compatible Los BIOS usan valores mágicos
0000
y1234
para decidir si el sistema debe contar la memoria o no en reinicio, realizando así una bota fría o caliente. Estos valores también son utilizados por los administradores de memoria EMM386 interceptando solicitudes de arranque. Los BIOS también usan valores mágicos55 AA
para determinar si un disco es arrancable. - El caché de disco MS-DOS SMARTDRV (codificado "Bambi") utiliza valores mágicos BABE y EBAB en funciones de API.
- Muchos controladores DR DOS, Novell DOS y OpenDOS desarrollados en el anterior European Development Centre en el Reino Unido utilizar el valor 0EDC como símbolo mágico al invocar o proporcionar funcionalidad adicional sentado en la parte superior de las funciones estándar de DOS (emulado), NWCACHE siendo un ejemplo.
Otros usos
- Ejemplos
- La dirección MAC predeterminada en Texas Instruments SOCs es DE:AD:BE:EF:00:00.
Límites de tipos de datos
Esta es una lista de límites de los tipos de almacenamiento de datos:
Decimal | Hex | Descripción |
---|---|---|
18,446,744,073,709,551,615 | FFBFFFBFFFBFFFBF | El valor máximo no asignado de 64 bits (264 −1) |
9,223,372,036,854,775,807 | 7FFFFFBFFFBFFFBF | El valor máximo firmado de 64 bits (263 −1) |
4.294.967.295 | FFBFFFBF | El valor máximo no firmado de 32 bits (232 −1) |
2,147,483,647 | 7FFFFFBF | Valor máximo firmado de 32 bits (231 −1) |
65.535 | FFBF | El valor máximo sin señalización de 16 bits (216 −1) |
32.767 | 7FFF | El valor máximo firmado de 16 bits (215 −1) |
255 | FF | El valor máximo de 8 bits sin señal (28 −1) |
127 | 7F | El valor máximo firmado de 8 bits (27 −1) |
−128 | 80 | Valor mínimo firmado 8 bits |
−32.768 | 8000 | Valor mínimo firmado 16 bits |
−2,147,483,648 | 80000000 | Valor mínimo firmado 32 bits |
−9,223,372,036,854,775,808 | 8000000000000000 | Valor mínimo firmado 64 bits |
GUIDes
Es posible crear o modificar identificadores únicos globalmente (GUID) para que sean memorables, pero no se recomienda hacerlo ya que compromete su fuerza como identificadores casi únicos. Las especificaciones para generar GUID y UUID son bastante complejas, lo que hace que sean prácticamente únicas, si se implementan correctamente.
Los números de identificación de producto de Microsoft Windows para productos de Microsoft Office a veces terminan en 0000-0000-0000000FF1CE
("OFFICE"), como {90160000-008C-0000- 0000-0000000FF1CE
}, el ID de producto para el "componente de extensibilidad hacer clic y ejecutar de Office 16".
Java utiliza varios GUID que comienzan con CAFEEFAC
.
En la tabla de particiones GUID del esquema de partición GPT, las particiones de arranque del BIOS utilizan el GUID especial {21686148-6449-6E6F-744E-656564454649
} que no sigue la definición de GUID; en cambio, se forma utilizando los códigos ASCII para la cadena "Hah!IdontNeedEFI
" parcialmente en orden little endian.
Valores de depuración
Losvalores de depuración mágicos son valores específicos escritos en la memoria durante la asignación o desasignación, de modo que luego será posible saber si se han dañado o no y hacer obvio cuándo se toman los valores de Se está utilizando memoria no inicializada. La memoria generalmente se ve en hexadecimal, por lo que son comunes los valores repetidos o de jerga hexadecimal memorables. Se pueden preferir valores numéricamente impares para que los procesadores sin direccionamiento de bytes fallen al intentar usarlos como punteros (que deben caer en direcciones pares). Se deben elegir valores que estén alejados de direcciones probables (el código del programa, datos estáticos, datos del montón o la pila). De manera similar, 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 poco probable, 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 indique un error como un desbordamiento del búfer o una variable no inicializada..
Ejemplos famosos y comunes incluyen:
Código | Descripción |
---|---|
00008123 | Utilizado en MS Visual C++. Los punteros eliminados se fijan en este valor, por lo que arrojan una excepción, cuando se utilizan después; es un alias más reconocible para la dirección cero. Se activa con la opción Lifecycle (/sdl) de Seguridad Development Lifecycle. |
..FACADE | "Facade", Utilizado por varios RTOS |
1BADB002 | "1 mala bota", número de magia de cabecera multiboot |
8BADF00D | "Comida mala", Indica que una aplicación Apple iOS ha sido terminada porque se produjo un tiempo de relojería. |
A5A5A5A5 | Utilizado en el desarrollo integrado porque el patrón de bits alternante (1010 0101) crea un patrón fácilmente reconocido en los osciloscopios y analizadores lógicos. |
A5 | Utilizado en el malloc PHK(3) de FreeBSD para depurar cuando /etc/malloc. conf se asocia a "-J" para inicializar toda la memoria recién asignada ya que este valor no es un puntero NULL o ASCII NUL carácter. |
ABABABAB | Utilizado por la depuración de Microsoft HeapAlloc() para marcar los bytes de guardia de "ninguna tierra" del hombre después de la memoria de montón asignada. |
ABADBABE | "Una chica mala", Utilizado por Apple como el número mágico "Boot Zero Block" |
ABBABABE | "ABBA babe", utilizado por Driver Parallel Lines memoria montón. |
ABADCAFE | "Un mal café", Se utiliza para inicializar toda la memoria no asignada (Mungwall, AmigaOS) |
B16B00B5 | "Big Boobs", Exigido por el hipervisor Hyper-V de Microsoft para ser utilizado por los clientes de Linux como la mitad superior de su "id invitado" |
BAADF00D | "Comida básica", Utilizado por la depuración de Microsoft HeapAlloc() para marcar la memoria de montón no inicializada |
BAAAAAAD | "Baaaaaad", Indica que el registro de Apple iOS es una pila de todo el sistema, no un informe de fallo |
BAD22222 | "Bad too repeatedly", Indica que una aplicación Apple iOS VoIP ha sido terminada porque se reanudó con demasiada frecuencia |
BADBADBADBAD | "Maldito malo", Burroughs grandes sistemas de memoria "ininicializada" (palabras de 48 bits) |
BADC0FFEE0DDF00D | "Comida rara de café", Utilizado en sistemas IBM RS/6000 de 64 bits para indicar registros de CPU no inicializados |
BADDCAFE | "Bad café", On Sun Microsystems' Solaris, marca memoria de núcleo no inicializada (KMEM_UNINITIALIZED_PATTERN) |
BBADBEEF | "Bad beef", Utilizado en WebKit, para errores particularmente indescubables |
BEBEBEBE | Usado por Dirección Sanitizador para llenar la memoria asignada pero no inicializada |
BEEFCACE | "Torta de carne", Utilizado por Microsoft. NET como un número mágico de archivos de recursos |
C00010FF | "Despegar", Indica que la aplicación Apple iOS fue asesinada por el sistema operativo en respuesta a un evento térmico |
CAFEBABE | "Cafe babe", Utilizado por Java para archivos de clase |
CAFED00D | "Cafe Dude", Utilizado por Java para su compresión de pack200 |
CAFEFEED | "Cafe feed", Utilizado por Sun Microsystems Solaris debugging kernel para marcar kmemfree() memoria |
CCCCCCCC | Utilizado por la biblioteca de tiempo de ejecución C++ de Microsoft y muchos entornos DOS para marcar la memoria de pila no inicializada. CC se asemeja al opcode de la Interrupción de punto de depuración INT 3 en procesadores x86.
|
CDCDCDCD | Utilizado por la función C/C++ de debug malloc() de Microsoft para marcar la memoria de salto no inicializada, generalmente devuelto de HeapAlloc() |
0D15EA5E | "Enfermedad de Zoro", Usado como bandera para indicar el arranque regular en las consolas GameCube y Wii |
DDDDDDDD | Utilizado por SmartHeap de MicroQuill y la función C/C++ de Microsoft debug free() para marcar memoria de heap liberada |
DEAD10CC | "Cerradura muerta", Indica que una aplicación Apple iOS ha sido terminada porque se mantuvo en un recurso del sistema mientras se ejecuta en el fondo |
DEADBABE | "Cariño muerto", Utilizado al comienzo de los archivos de arena IRIX de Silicon Graphics |
DEADBEEF | "Dead beef", Famosamente utilizado en sistemas IBM como el RS/6000, también utilizado en los sistemas operativos Mac OS clásicos, OPENSTEP Enterprise, y el Commodore Amiga. En Sun Microsystems' Solaris, marca la memoria del núcleo liberada (KMEM_FREE_PATTERN) |
DEADCAFE | "Café muerto", Utilizado por Microsoft. NET como número de error en DLLs |
DEADC0DE | "Código muerto", Utilizado como un marcador en el firmware OpenWRT para significar el comienzo del sistema de archivos jffs2 creado al final del firmware estático |
DEADFA11 | "Dead fail", Indica que una aplicación de Apple iOS ha sido la fuerza renunciada por el usuario |
DEADF00D | "Comida muerta", Utilizado por Mungwall en el Commodore Amiga para marcar la memoria asignada pero no inicializada |
DEFEC8ED | "Defecado", utilizado para los vertederos de núcleo OpenSolaris |
DEADDEAD | "Muerto muerto" indica que el usuario inició deliberadamente un vertedero de fallos desde el depurador del kernel o el teclado bajo Microsoft Windows. |
D00D2BAD | "Dude, Too Bad", Usado por Safari se estrella en macOS Big Sur. |
EBEBEBEB | Desde MicroQuill SmartHeap |
FADEDEAD | "Fade dead", Viene al final para identificar cada script AppleScript |
FDFDFDFD | Utilizado por la función C/C++ de debug malloc() de Microsoft para marcar los bytes de guardia de "ninguna tierra" antes y después de la memoria de heap asignada, y algunas funciones de depuración Secure C-Runtime implementadas por Microsoft (por ejemplo strncat_s) |
FEE1DEAD | "Feel muerto", Utilizado por Linux reboot() syscall |
FEEDFACE | "Cara de alimentación", Visto en PowerPC Mach-O binaries en la plataforma Mac OSX de Apple Inc. En Sun Microsystems' Solaris, marca la zona roja (KMEM_REDZONE_PATTERN)
Utilizado por el reproductor VLC y algunas cámaras IP en protocolo RTP/RTCP, el reproductor VLC envía cuatro bytes en el orden del endianness del sistema. Algunas cámaras IP esperan que el jugador envíe este número mágico y no comience el flujo si no se recibe. |
FEEEFEEE | "Cargo de pago", Utilizado por la depuración de Microsoft HeapFree() para marcar la memoria del montón liberado. Algunos valores internos cercanos de contabilidad pueden tener la palabra alta puesta a FEEE también. |
La mayoría de ellos tienen una longitud de 32 bits cada uno: 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 una coincidencia; se analizan en detalle en el libro de Steve Maguire Writing Solid Code de Microsoft Press. Da una variedad de criterios para estos valores, tales como:
- No deben ser útiles; es decir, se debe esperar que la mayoría de los algoritmos que operan en ellos hagan algo inusual. Los números como cero no encajan en este criterio.
- Debe reconocerse fácilmente por el programador como valores inválidos en el depurador.
- En máquinas que no tienen alineación de byte, deben ser números impares, por lo que dereferirlas como direcciones causa una excepción.
- Deben causar una excepción, o tal vez incluso una ruptura de depuración, si se ejecuta como código.
Dado que a menudo se usaban para marcar áreas de la memoria que estaban esencialmente vacías, algunos de estos términos comenzaron a usarse en frases que significaban "desaparecido, abortado, borrado de la memoria"; p.ej. "Su programa es DEADBEEF".