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?

questionAnswers(2)

yourAnswerToTheQuestion