clang中参数入栈顺序问题

发布时间 2023-07-23 17:12:24作者: 写bug的民工

在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