Dado o estado da pilha e dos registros, podemos prever o resultado do comportamento indefinido de printf
Aqui está um código C simples para um teste de classe:
#include <stdio.h>
int main() {
float a = 2.3;
printf("%d\n", a);
return 0;
}
Compilado e executado em:
Apple LLVM versão 6.1.0 (clang-602.0.53
) (com base no LLVM 3.6.0svn)
Alvo:x86_64
-apple-darwin14.5.0
A saída deste código éundefined
. Estou tentando prever a saída inspecionando a memória próximaa
com o depurador (X
comando em gdb). Por exemplo, quando o endereço dea
é0x7fff5fbffb98
, então o contexto próximo&a
é o seguinte:
0x7fff5fbffb98: 1075000115
0x7fff5fbffb9c: 0
0x7fff5fbffba0: 1606417336
0x7fff5fbffba4: 32767
0x7fff5fbffba8: -1754266167
0x7fff5fbffbac: 32767
0x7fff5fbffbb0: -1754266167
0x7fff5fbffbb4: 32767
Então a saída deprintf
é1606417352
. Eu sei que a saída ao usar um especificador incorreto é indefinida. Por curiosidade, esperava que a saída desse comportamento indefinido estivesse relacionada a alguma memória da pilha ou dos registros em execução, mas não descobri como correlacioná-lo.
Então, qual endereço ou registro é usado para definir a saída desteprintf
? Em outras palavras, dado o estado da pilha em execução e todos os valores de todos os registros, podemos prever (e se sim, como) a saída desse comportamento indefinido?