Número mágico (programación)

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Secuencia de bytes utilizados para identificar o indicar el formato de un archivo

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 que dekSize 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 que deckSize 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 como d = 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 cambian CAFED00D.
  • Los archivos de imagen GIF tienen el código ASCII para "GIF89a" ()474946383961o "GIF87a" ()474946383761)
  • Los archivos de imagen JPEG comienzan con FFD8 y terminar con FFD9. Los archivos JPEG/JFIF contienen la cadena null terminada "JFIF" (JFIF)4A46494600). Los archivos JPEG/Exif contienen la cadena null terminada "Exif" (Exif)4578696600), 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" ()89504E470D0A1A0A). 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... 4D546864) seguido de más metadatos.
  • Los scripts Unix o Linux pueden comenzar con un shebang ("#!", 2321) 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"7F454C46).
  • Los archivos y programas PostScript comienzan con "%!" ()2521).
  • Los archivos PDF comienzan con "%PDF" (hex 25504446).
  • Los archivos ejecutables DOS MZ y el stub EXE de los archivos de Microsoft Windows PE (Portable Executable) comienzan con los caracteres "MZ" (MZ)4D5A), las iniciales del diseñador del formato de archivo, Mark Zbikowski. La definición permite el "ZM" poco común5A4DTambién para dosZMXP, un EXE no-PE.
  • El formato de superblock del sistema de archivos rápido de Berkeley se identifica como 19540119 o 011954 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 55AA 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!" ()4A6F7921Como 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 49492A00. "MM" es para Motorola, que utiliza gran orden de byte endiano, por lo que el número mágico es 4D4D002A.
  • Archivos de texto Unicode codificados en UTF-16 a menudo comienzan con la marca Byte Order para detectar endianness (FEFF para grandes endian y FFFE 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, EFBBBF.
  • LLVM Los archivos Bitcode comienzan con "BC" (BC)4243).
  • 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) D0CF11E0, que es visualmente sugestivo de la palabra "DOCFILE0".
  • Los encabezados en archivos ZIP suelen aparecer en editores de texto como "PK♥♦" ()504B0304), 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: 377ABCAF271C).
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 un 00 o 01 para la versión menor. En UDP MSRPC pide el primer byte es siempre 04.
  • 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, y D4 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 constante 0xDAB5BFFA 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 con 16 (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 y 1234 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ágicos 55 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
Did you mean:

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

Los

valores 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
00008123Utilizado 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.
A5A5A5A5Utilizado 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.
A5Utilizado 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.
ABABABABUtilizado 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
BEBEBEBEUsado 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
CCCCCCCCUtilizado 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.
CDCDCDCDUtilizado 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
DDDDDDDDUtilizado 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.
EBEBEBEBDesde MicroQuill SmartHeap
FADEDEAD"Fade dead", Viene al final para identificar cada script AppleScript
FDFDFDFDUtilizado 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".

Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save