Рассмотрит функцию C (с внешней связью), как следующему:Летучий/модифицированного адрес возврата
void f(void **p)
{
/* do something with *p */
}
Теперь предположит, что f
вызывается таким образом, таким образом, что p
указует на адрес возврата f
на стек, как в следующем коде (при условии, System V AMD64 ABI):
leaq -8(%rsp), %rdi
callq f
что может случиться так, что код f
изменяет адрес возврата в стеке путем присвоения значения * р. Таким образом, компилятору придется обрабатывать обратный адрес в стеке как изменчивое значение. Как я могу сообщить компилятору gcc в моем случае, что адрес возврата нестабилен?
В противном случае компилятор может, по крайней мере, в принципе, генерировать следующий код для f
:
pushq %rbp
movq 8(%rsp), %r10
pushq %r10
## do something with (%rdi)
popq %r10
popq %rbp
addq 8,%rsp
jmpq *%r10
Правда, маловероятно, что компилятор будет когда-либо генерировать код, как это, но это, кажется, не будет запрещено без каких-либо дополнительных атрибутов функции. И этот код не заметил бы, если адрес возврата в стеке будет изменен в середине функции, потому что исходный адрес возврата уже получен в начале функции.
P.S .: Как было предложено Питером Кордесом, я должен лучше объяснить цель моего вопроса: речь идет о сборке мусора динамически сгенерированного машинного кода с помощью подвижного сборщика мусора. Функция f
означает сборщик мусора. Вызов f
может быть функцией, код которой перемещается во время работы f
, поэтому я придумал идею о том, что f
знает адрес возврата, так что f
может его соответствующим образом изменить, независимо от того, указывает ли область памяти адрес возврата был перемещен или нет.
Все это неопределенное поведение –
В C99, конечно. Но это не означает, что он не будет иметь определенного поведения в реальной реализации, такой как gcc, используя правильные атрибуты функции/прагмы. И об этом мой вопрос. – Marc
Вернитесь, когда у вас есть реальная проблема в реальном коде, который действительно компилируется. Теоретическое обсуждение вопросов, связанных с реализацией, утомительно. –