在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