Учитывая состояние стека и регистров, можем ли мы предсказать результат неопределенного поведения printf
Вот простой код на C для теста класса:
#include <stdio.h>
int main() {
float a = 2.3;
printf("%d\n", a);
return 0;
}
Скомпилировано и запущено на:
Apple LLVM версия 6.1.0 (clang-602.0.53
) (на основе LLVM 3.6.0svn)
Цель:x86_64
-Apple-darwin14.5.0
Выход этого кодаundefined
, Я пытаюсь предсказать вывод, осматривая память рядомa
с отладчиком (X
команда в GDB). Например, когда адресa
является0x7fff5fbffb98
тогда контекст рядом&a
как следует:
0x7fff5fbffb98: 1075000115
0x7fff5fbffb9c: 0
0x7fff5fbffba0: 1606417336
0x7fff5fbffba4: 32767
0x7fff5fbffba8: -1754266167
0x7fff5fbffbac: 32767
0x7fff5fbffbb0: -1754266167
0x7fff5fbffbb4: 32767
Тогда выводprintf
является1606417352
, Я знаю, что вывод при использовании неправильного спецификатора не определен. Из любопытства я ожидал, что выходные данные этого неопределенного поведения будут связаны с некоторой памятью из запущенного стека или регистров, но я не выяснил, как это соотнести.
Так какой адрес или регистр используется для установки выхода этогоprintf
? Другими словами, учитывая состояние работающего стека и всех значений из всех регистров, можем ли мы предсказать (и если да, то как) результат этого неопределенного поведения?