clang中参数入栈顺序问题
在clang中,函数调用的参数压栈顺序是从左往右,而在gcc中参数压栈顺序是从右往左。
遇到这个问题的场景是现有项目中有一段代码,在gcc下编译后执行是没问题的,但是在clang下执行却一直报错,通过debug后发现,是由于函数参数的压栈顺序不同导致的。
问题代码的逻辑类似于以下demo:
#include <stdio.h>
static int count = 0;
int get_count()
{
count++;
return count;
}
int test_param_order(int a, int b, int c)
{
printf("a=%d, b=%d, c=%d\n", a, b, c);
return 0;
}
int main(int argc, char* argv[])
{
test_param_order(get_count(), get_count(), get_count());
return 0;
}
其中get_count()函数会返回一个全局变量+1的结果,并且全局变量也会加1.
如果是gcc编译执行的结果如下:
a=3, b=2, c=1
可以知道c先压栈,再是b,最后是a,所以是从右往左
而在clang编译执行的结果如下:
a=1, b=2, c=3
由此可知a先压栈,再是b,最后是c,所以是从左往右
这种代码依赖于参数压栈的顺序,非常不友好,不建议使用,仅作示例说明。
参考:
c++参数入栈顺序和参数计算顺序 https://www.cnblogs.com/pandamohist/p/13875876.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下