Гарантировано ли безопасное/переносное использование адреса параметра функции в компиляторе, совместимом с C89/C99?C адрес параметра функции?
В качестве примера, AAPCS для 32-разрядной ARM использует регистры r0-r3 для передачи параметров, если параметры функции соответствуют определенным требованиям размера и выравнивания. Я бы предположил, что использование адреса параметра, прошедшего через регистр, приведет к неожиданным результатам, но я проверил тест на компиляторе ARM, который я использую, и, похоже, он переместит эти параметры в стек, если код пытается ссылаться на адреса этих параметров. Хотя это будет выглядеть безопасно в моем конкретном приложении, мне интересно, гарантировано ли это в архитектуре (с компилятором, совместимым с ANSI/ISO), который может напрямую использовать регистры для передачи параметров функции.
Знают ли стандарты это поведение?
Это разрешено по стандарту ISO C –
Что такое M.M. сказал. Мне более любопытно, как бы код вызова *, который, возможно, находится в отдельном исходном файле и скомпилирован отдельно, знает, когда нужно проходить по регистру или по стеку. Или ARM всегда принимает пропуск по регистру, когда требования к размеру/выравниванию удовлетворяются сигнатурой функции (а вызываемый код заботится о переходе в стек)? – selbie
Аргументы передаются через соответствующие регистры в соответствии с ABI. Аргументы, адрес которых берется внутри тела функции, затем переносятся в автоматическое хранилище (aka * в стеке *). – chqrlie