CDB básico:o cdb varia como anota o escopo?
Pergunta
Se eu compilar:
int *a;
void main(void)
{
*a = 1;
}
e depois desmontar main no cdb recebo:
pointersproject!main:
00000001`3fd51010 mov rax,qword ptr [pointersproject!a (00000001`3fd632f0)]
00000001`3fd51017 mov dword ptr [rax],1
00000001`3fd5101d xor eax,eax
00000001`3fd5101f ret
Então *a é simbolizado por pointersproject!a.Tudo certo.
Porém, se eu declarar o ponteiro dentro de main:
void main(void)
{
int *a;
a = 1;
}
Vejo que a é apenas um deslocamento do ponteiro da pilha (acredito), em vez da estrutura legível por humanos que eu esperaria (como, digamos, pointersproject!main!a):
pointersproject!main:
00000001`3fd51010 sub rsp,18h
00000001`3fd51014 mov rax,qword ptr [rsp]
00000001`3fd51018 mov dword ptr [rax],1
00000001`3fd5101e xor eax,eax
00000001`3fd51020 add rsp,18h
00000001`3fd51024 ret
Provavelmente, trata-se tanto da minha compreensão do que o compilador faz quanto de qualquer outra coisa, exceto:alguém pode explicar por que a notação para a não é o que eu espero?
(Isso foi inspirado na reflexão ao observar a depuração x64 do Windows:Fundamentos práticos de Dmitry Vostokov).
Solução
Quando uma variável é definida dentro de uma função, ela é uma variável automática, a menos que seja declarada explicitamente como estática.Tais variáveis só permanecem durante a execução da função e normalmente são alocadas na pilha, portanto, são desalocadas quando a função termina.A mudança que você vê no código cumprido não se deve à mudança no escopo, mas à mudança de variável estática para automática.Se você fizer um estático, ele não será alocado na pilha, mesmo que seu escopo seja a função main.