При вызове функции в Linux (или OS X, если на то пошло), может ли пользователь изменить значения аргументов в стеке? Я полагал, что поскольку вызывающий абонент очищает их, они должны содержать те же значения после вызова функции. Однако я обнаружил, что GCC с -O2 изменяет параметры, которые были переданы ему в стеке. Я также искал документацию, включая соглашения о вызовах System V i386, но не смог найти окончательный ответ на этот вопрос.Соглашения о вызовах C и переданные аргументы
Вот пример кода, который я отлаживал.
pushl %eax # %eax = 0x28
call _print_any
popl %eax
# %eax is now 0x0a
Я предположил бы, что GCC изменение этого параметра в стеке в порядке, но я хочу знать, где указано, что он может сделать это.
«Модификация» каким образом? Вы понимаете, что, если вы не сообщите компилятору об этом, нет оснований ожидать, что он не будет гадать со значениями в стеке, чтобы завершить его оптимизацию? –
Как работает код C и как работают соглашения о вызовах, могут быть совершенно разными. Ниже приведены соглашения о вызове System V C для i386, если вам интересно. Тем не менее, он имеет несколько неопределенность в отношении некоторых вещей ... http://www.sco.com/developers/devspecs/abi386-4.pdf –