我有一个以标准方式使用可变参数的 c 函数,下面是一个简化示例:

    void func(parameter,...) {
     va_list args;
     va_start(args, parameter);

     //process args
     v1 = va_arg(args,sometype);
     v2 = va_arg(args,sometype);
        ...
     vn = va_arg(args,sometype);

     va_end(args);
}


//call func

func(parameter, p1, p2, ..., pn);

在所有设备 armv7s 及更低版本以及包括 64 位模拟器在内的所有模拟器上,这都成功了,变量 v1 到 vn 被分配了 p1 到 pn,但是当它在 arm64 上执行时,似乎可变参数列表是向后的( v1 = pn, v2 = pn-1, ..., vn = p1)

有什么解决办法吗?还是我错过了描述此更改的文档?

谢谢

编辑:

我没有提到这个问题的一个关键因素,我以前没想过要提到。我试图用通用可变参数函数来混合非可变参数函数。

注意:使用的编译器是 Apple LLVM 5.0

最佳答案

我怀疑这与参数传递给函数的方式发生了变化。

有三种方法可以做到这一点:在寄存器中、在堆栈中以及两者的组合,这取决于参数的数量和类型。似乎在 ARMv6、ARMv7 和 ARM64 体系结构之间 ABI 遵循的约定有所不同。

不管实际的约定如何,编译器都应该透明地处理这个问题,所以如果它的行为不符合标准,你可能需要考虑更新你的工具链(你没有在你的问题中提到编译器,但这是关键)。

Apple's documentation 在不同架构版本的不同调用约定上可能有助于跟踪编译器未考虑的任何更改。

有关 ARM 如何期望传递参数的更多信息,请参阅 Procedure Call Standard for the ARM architecture(ARMv6, ARMv7section 5.4 in the 64 bit version of the ABI 的第 5.5 节

关于ios - stdargs [va_start()、va_arg() 等] 在 arm64 上坏了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20621627/

10-11 22:00