Nombre magique (programmation) - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Magic number de débogage

Certains magic number ont une valeur particulière qui est écrite dans la mémoire vive pendant l'allocation dynamique (en) ou la ré-allocation pour permettre un débugage en cas de plantage. Pendant le débugage, la mémoire est généralement affichée en héxadécimal où des codes répétitifs ou en Hexspeak (en) sont facilement reconnaissables.

Ces valeurs sont utilisées de préférence sur des processeurs sans bit d'adressage car ceux-ci planteront s'ils essaient de les utiliser comme pointeur. De même, elles ne doivent pas faire partie du jeu d'instructions.

Vu qu'il soit rare qu'un entier codé sur 32 bit prenne une de ses valeurs, le passage d'un de ces nombres dans un débbugeur ou un core dump (en) indique généralement un dépassement de tampon ou une variable non initialisée.

Valeurs classiques
Code Description
..FACADE Utilisé par beaucoup de systèmes d'exploitation temps réel
8BADF00D Utilisé par Apple comme code d'exception dans l'iPhone quand une application a pris trop de temps pour se lancer ou se terminer
A5A5A5A5 Utilisé sur les systèmes embarqués car la séquence binaire correspondante (10100101) est facilement reconnaissable sur un oscilloscope ou un analyseur logique
ABABABAB Utilisé par la fonction HeapAlloc() de Microsoft pour marquer le « no man's land » d'un Guard byte (en) après l'allocation de la mémoire heap
ABADBABE Utilisé par Apple comme « Boot Zero Block »
ABADCAFE Valeur d'initialisation utilisée pour démasquer les pointeurs brisés
BAADF00D Utilisé par la fonction LocalAlloc(LMEM_FIXED) de Microsoft pour marquer la mémoire heap allouée mais non initialisée
BADBADBADBAD Utilisé sur les calculateurs de Burroughs Corporation pour repérer la mémoire non-initialisée (mot de 48-bit)
BADC0FFEE0DDF00D Utilisé sur le système 64 bits RS/6000 pour indiquer les registres processeurs non-initialisés
BADCAB1E Code d'erreur retourné par le debuggeur eVC quand la connexion avec le débuggeur est coupée
BADDCAFE Sous Solaris, marque la mémoire du noyau qui n'est pas initialisée (KMEM_UNINITIALIZED_PATTERN)
BEEFCACE Utilisé sur le framework .NET comme nombre magique pour les fichiers de ressources (en)
C0DEDBAD Utilisé pour le débuggage des tables MMU.
CAFEBABE Dans les exécutables Mach-O (Fat binary (en) dans les processeurs 68k et les PowerPC) pour identifier les fichiers objet et les .class java
CAFEFEED Sous Solaris, marque la mémoire allouée par la fonction kmemfree() pour le debugage
CCCCCCCC Utilisé par la libraire de debugage du C++ de Microsoft pour repérer la mémoire stack non-initialisée
CDCDCDCD Utilisé par la libraire de debugage du C++ de Microsoft pour repérer la mémoire heap non-initialisée
CEFAEDFE Peut-être vu dans les binaires Mach-O de Mac OS X (voir FEEDFACE)
DDDDDDDD Utilisé par MicroQuill's SmartHeap et le débuggeur mémoire C++ de Microsoft pour marquer la mémoire heap libérée
DEADBABE Marque le début des fichiers arena d'IRIX
DEADBEEF Connu pour être utilisé sur les systèmes IBM (notamment sur RS/6000), le premier Mac OS (OPENSTEP) et sur le Commodore Amiga. Sous Solaris, marque la mémoire du noyau libérée (KMEM_FREE_PATTERN)
DEADDEAD Le code d'erreur STOP de Windows utilisé quand l'utilisateur crash volontairement la machine
DEADF00D Marque toutes les nouvelles zones mémoires allouées quand elles n'ont pas été explicitement nettoyées après une corruption
DEADFA11 Utilisé par Apple comme code d'exception dans l'iPhone quand l'utilisateur a forcé une application à s'éteindre
EBEBEBEB Pour MicroQuill's SmartHeap
FADEDEAD Marque le fin des scripts AppleScript
FDFDFDFD Utilisé par le débuggeur mémoire C++ de Microsoft pour marquer le « no man's land » d'un Guard byte (en) avant et après la mémoire heap allouée
FEE1DEAD Utilisé par l'appel système reboot() de Linux
FEEDFACE Peut-être vu sur le binaire PowerPC Mach-O de Mac OS X. Sous Solaris, marque la zone rouge (KMEM_REDZONE_PATTERN)
FEEEFEEE Utilisé par la fonction HeapFree() de Microsoft pour marquer la mémoire heap libérée

La prépondérance de valeur issue de technologies de Microsoft ; elles sont largement commentées dans le livre de Steve Maguire (en) Writing Solid Code (en). Il donne plusieurs critères pour les choisir :

  • Elles ne doivent pas d'usage courant ; « 0 » ne satisfait pas ce critère.
  • Elles doivent être facilement reconnaissables dans un débuggeur.
  • Sur les machines sans alignement de données, elles doivent être impaires pour que leur déréférencement provoque une exception.
  • Elles doivent provoquer des exceptions ou un point d'arrêt si elles sont exécutées.

Comme elles sont souvent utilisées pour identifier des zones mémoires quasiment vides, elles tendent parfois à être utilisées dans le langage courant dans le sens « perdu, abandonné, vidé de la mémoire » : par exemple, « Ton programme est DEADBEEF ».

Page générée en 0.079 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise