【发布时间】:2016-04-03 19:48:50
【问题描述】:
在符合 C89/C99 的编译器上使用函数参数的地址是否保证安全/可移植?
例如,如果函数参数满足特定的大小和对齐要求,则 32 位 ARM 的 AAPCS 使用寄存器 r0-r3 进行参数传递。我会假设使用通过寄存器传递的参数的地址会产生意想不到的结果,但我在我正在使用的 ARM 编译器上运行了一个测试,如果代码尝试引用地址,它似乎会将这些参数重新定位到堆栈这些参数。虽然它在我的特定应用程序中看起来很安全,但我想知道这是否可以在可以直接利用寄存器传递函数参数的架构(使用符合 ANSI/ISO 的编译器)中得到保证。
标准是否定义了这种行为?
【问题讨论】:
-
这在 ISO C 标准下是允许的
-
什么MM说。我更好奇可能在单独的源文件中并单独编译的调用代码如何知道何时通过寄存器传递与通过堆栈传递。或者当函数签名满足大小/对齐要求(并且调用的代码负责移动到堆栈)时,ARM是否总是假设通过寄存器传递?
-
参数根据 ABI 通过合适的寄存器传递。然后将地址在函数体中的参数迁移到自动存储(也称为在堆栈上)。
-
函数参数是函数内部的普通变量。除非您使用
register存储说明符,否则标准保证您可以获取他们的地址。 -
@selbie:这不会改变接口,正如 ABI 定义的那样(对于现代 ARM,AAPCS)。内部隐藏在函数内部。