No Visual Studio, todos nós já tivemos "baadf00d", vimos "CC" e "CD" ao inspecionar variáveis no depurador em C ++ durante o tempo de execução.
Pelo que entendi, "CC" está no modo DEBUG apenas para indicar quando uma memória é nova () ou alocada () e unitilializada. Enquanto "CD" representa a memória excluída ou liberada. Eu só vi "baadf00d" na versão RELEASE (mas posso estar errado).
De vez em quando, nos deparamos com uma situação de vazamento de memória, excesso de buffer etc., e esse tipo de informação é útil.
Alguém teria a gentileza de apontar quando e em que modos a memória está configurada para padrões de bytes reconhecíveis para fins de depuração?
debugging
visual-c++
HidekiAI
fonte
fonte
Respostas:
Este link tem mais informações:
http://en.wikipedia.org/wiki/Magic_number_(programming)
fonte
BAADF00D
(comida ruim),BEEFCACE
(bolo de carne),BAADCAB1E
(cabo ruim),BADCAFE
(café ruim) eDEADDEAD
(morto morto). Isso é intencional?0xDEADBEEF
,0xC0EDBABE
Também clássicos mesmo se eles não se enquadram em vernáculo do MSBEA71E5
Na verdade, existem algumas informações úteis adicionadas às alocações de depuração. Esta tabela está mais completa:
http://www.nobugs.org/developer/win32/debug_crt_heap.html#table
fonte
No que diz respeito
0xCC
e0xCD
, em particular, estes são relíquias do Intel 8088 / 8086 conjunto de instruções do processador de volta na década de 1980.0xCC
é um caso especial do código de interrupção do software . A versão especial de byte único permite que um programa gere interrupção 3 .INT
0xCD
0xCC
Embora os números de interrupção de software sejam, em princípio, arbitrários,
INT 3
era tradicionalmente usado para a função de quebra ou ponto de interrupção do depurador , uma convenção que permanece até hoje. Sempre que um depurador é iniciado, ele instala um manipulador de interrupção paraINT 3
que, quando esse código de operação for executado, o depurador seja acionado. Normalmente, ele pausará a programação em execução no momento e mostrará um prompt interativo.Normalmente, o
INT
código de operação x86 tem dois bytes:0xCD
seguido pelo número de interrupção desejado de 0 a 255. Agora, embora você poderia emitir0xCD 0x03
paraINT 3
, a Intel decidiu adicionar um especial version--0xCC
sem byte adicional - porque um código de operação deve ser apenas um byte para funcionar como um 'byte de preenchimento' confiável para a memória não utilizada.O objetivo aqui é permitir uma recuperação normal, se o processador saltar por engano na memória que não contém nenhuma instrução pretendida . As instruções de vários bytes não são adequadas para esse propósito, pois um salto incorreto pode ocorrer em qualquer deslocamento de bytes possível, onde teria que continuar com um fluxo de instruções formado adequadamente.
Obviamente, os opcodes de um byte funcionam trivialmente para isso, mas também pode haver exceções peculiares: por exemplo, considerando a sequência de preenchimento
0xCDCDCDCD
(também mencionada nesta página), podemos ver que é razoavelmente confiável, pois não importa onde o ponteiro da instrução esteja ( exceto, talvez, o último byte preenchido), a CPU pode continuar executando uma instrução x86 de dois bytes válidaCD CD
, nesse caso, para gerar a interrupção 205 do software (0xCD).Mais estranho ainda, embora
CD CC CD CC
seja 100% interpretável - dando umaINT 3
ou outraINT 204
- a sequênciaCC CD CC CD
é menos confiável, apenas 75% como mostrado, mas geralmente 99,99% quando repetida como um preenchimento de memória de tamanho int.Referência do Macro Assembler , 1987
fonte
NOP
? Não seria suficiente inserir um único0xCC
byte com oeb
comando (inserir bytes)?