gpt4 book ai didi

C ABI : is changing a void function to return an int a breaking change?

转载 作者:太空狗 更新时间:2023-10-29 16:41:27 24 4
gpt4 key购买 nike

是否有任何非奇特的架构/操作系统/编译器发生以下变化:

void func(void *, int, int)

到:

int func(void *, int, int)

会破坏 ABI 吗? (即,为“void”版本的共享库编译的程序在使用“int”版本运行时会中断)

最佳答案

有几条评论说不,我们可以通过一点推理来加强这一点。在最熟悉的 ABI 中,声明为 void func(void *, int, int) 的函数被允许使用寄存器,其中 int 结果将作为暂存器;它不需要保存和恢复它。具有声明 int func(void *, int, int) 的函数是需要 以使用将返回 int 结果的寄存器。在其他方面,这些声明是相同的。因此,int func(void *, int, int) 的任何实现的机器码也是满足 void func(void *, int, int) 的机器码.

换句话说,调用者无法区分故意在返回寄存器中返回结果的机器代码与恰好在该寄存器中留下一些临时计算的代码。

请注意,此推理要求被调用函数隐藏在 ABI 之后;它依赖于 ABI 指定的二进制行为。如果被调用函数的源代码在编译被调用函数时可见(或可能影响调用实现方式的实现的其他部分),则优化可能导致绕过 ABI 的行为(例如,观察被调用例程不使用返回寄存器,因此在调用者中使用它来保存一些预期在调用过程中保持不变的值。

既然你说这是一个共享库,你可能是安全的:共享库是单独编译的,它的源代码对它的调用者不可用。但是,您应该考虑侧 channel 。例如,共享库可能是共享源并包含跨库调用的一组库的一部分。在这种情况下,某人可能拥有旧版本的共享库,该共享库是根据 void 源代码编译的,而新版本的共享库包含 int来源。 (甚至这需要不寻常的源代码安排或跨多个编译单元集成信息的奇特编译器。)

关于C ABI : is changing a void function to return an int a breaking change?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15626579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com