Dans Visual Studio, nous avons tous eu "baadf00d", avons vu "CC" et "CD" lors de l'inspection des variables dans le débogueur en C ++ pendant l'exécution.
D'après ce que je comprends, "CC" est en mode DEBUG uniquement pour indiquer quand une mémoire a été new () ou alloc () et unitilialized. Tandis que "CD" représente la mémoire supprimée ou libérée. Je n'ai vu que "baadf00d" dans la version RELEASE (mais je peux me tromper).
De temps en temps, nous nous retrouvons dans une situation de résolution des fuites de mémoire, des dépassements de mémoire tampon, etc. et ce type d'informations est très pratique.
Quelqu'un serait-il assez aimable pour indiquer quand et dans quels modes la mémoire est définie sur des modèles d'octets reconnaissables à des fins de débogage?
la source
Réponses:
Ce lien contient plus d'informations:
http://en.wikipedia.org/wiki/Magic_number_(programming)
la source
BAADF00D
(mauvaise nourriture),BEEFCACE
(gâteau de boeuf),BAADCAB1E
(mauvais câble),BADCAFE
(mauvais café) etDEADDEAD
(mort mort). Est-ce intentionnel?0xDEADBEEF
,0xC0EDBABE
aussi des classiques même s'ils ne sont pas tombés dans la langue vernaculaire de MSBEA71E5
Il y a en fait pas mal d'informations utiles ajoutées aux allocations de débogage. Ce tableau est plus complet:
http://www.nobugs.org/developer/win32/debug_crt_heap.html#table
la source
En ce qui concerne
0xCC
et0xCD
en particulier, ce sont des vestiges de l' Intel 8088 / 8086 instruction de processeur ensemble dans les années 1980.0xCC
est un cas particulier de l' opcode interruption logicielle . La version spéciale à un octet permet à un programme de générer une interruption 3 .INT
0xCD
0xCC
Bien que les nombres d'interruptions logicielles soient, en principe, arbitraires,
INT 3
était traditionnellement utilisé pour la fonction d' interruption ou de point d'arrêt du débogueur , une convention qui reste à ce jour. Chaque fois qu'un débogueur est lancé, il installe un gestionnaire d'interruption pourINT 3
que lorsque cet opcode est exécuté, le débogueur soit déclenché. En général, il suspend la programmation en cours d'exécution et affiche une invite interactive.Normalement, l'
INT
opcode x86 est de deux octets:0xCD
suivi du numéro d'interruption souhaité de 0 à 255. Maintenant, bien que vous puissiez émettre0xCD 0x03
pourINT 3
, Intel a décidé d'ajouter une version spéciale -0xCC
sans octet supplémentaire - car un opcode ne doit être qu'un octet pour fonctionner comme un `` octet de remplissage '' fiable pour la mémoire inutilisée.Le point ici est de permettre une récupération gracieuse si le processeur saute par erreur dans la mémoire qui ne contient aucune instruction prévue . Les instructions multi-octets ne conviennent pas à cet objectif car un saut erroné pourrait atterrir à n'importe quel décalage d'octet possible où il devrait continuer avec un flux d'instructions correctement formé.
Évidemment, les opcodes à un octet fonctionnent trivialement pour cela, mais il peut aussi y avoir des exceptions bizarres: par exemple, compte tenu de la séquence de remplissage
0xCDCDCDCD
(également mentionnée sur cette page), nous pouvons voir qu'elle est assez fiable car peu importe où le pointeur d'instruction atterrit ( sauf peut - être le dernier octet rempli), la CPU peut reprendre l'exécution d'une instruction x86 valide à deux octetsCD CD
, dans ce cas pour générer l'interruption logicielle 205 (0xCD).Plus étrange encore, alors qu'elle
CD CC CD CC
est 100% interprétable - donnant soitINT 3
ouINT 204
- la séquenceCC CD CC CD
est moins fiable, seulement 75% comme indiqué, mais généralement 99,99% lorsqu'elle est répétée comme un remplissage de mémoire de taille int.Macro Assembler Reference , 1987
la source
NOP
pour quoi ? La saisie d'un seul0xCC
octet avec la commandeeb
(entrer les octets) ne suffirait-elle pas?