С учетом фрагмента кода:
int main()
{
printf("Val: %d", 5);
return 0;
}
Есть ли какая-либо гарантия, что компилятор будет хранить "Val: %d"
и '5'
смежно? Например:
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| ... | %d | ' ' | ':' | 'l' | 'a' | 'V' | '5' | ... |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
^ ^ ^
| Format String | int |
Как именно распределяются эти параметры в памяти?
Кроме того, выполняет ли функция printf значение int относительно строки формата или по абсолютной величине? Так, например, в данных
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| ... | %d | ' ' | ':' | 'l' | 'a' | 'V' | '5' | ... |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
^ ^ ^
| Format String | int |
когда функция встречает %d
, уже будет сохраненный адрес памяти для первого параметра функции, на который будет ссылаться, или будет вычисляться значение относительно первого элемента строки формата?
Извините, если я запутался, моя основная цель - понять, как использовать форматирование строк, где пользователю разрешено предоставлять строку формата, как описано в этом документе.
http://www.cis.syr.edu/~wedu/Teaching/cis643/LectureNotes_New/Format_String.pdf
Мои проблемы возникают при атаке, описанной на стр. 3 и 4. Я решил, что %x
должен пропустить 16 бит, которые занимает строка, что указывает на то, что функция, выделенная смежно, и ссылки относительно, но другие источники указывают, что не гарантируется, что компилятор должен распределять смежно, и я был обеспокоен тем, что документ был упрощенным.