首页 > 其他分享 >clang中参数入栈顺序问题

clang中参数入栈顺序问题

时间:2023-07-23 17:26:16浏览次数:48  
标签:count 顺序 入栈 get int 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

标签:count,顺序,入栈,get,int,clang
From: https://www.cnblogs.com/lifewithlight/p/17575266.html

相关文章

  • 数据结构练习笔记——顺序栈的基本操作
    顺序栈的基本操作【问题描述】按照要求完成顺序栈的设计【输入形式】无【输出形式】2019181716151413121110987654321#include<iostream>usingnamespacestd;#include<stdlib.h>#include<stdio.h>#defineSTACKSIZE10#defineINCRE2......
  • 模块的定位顺序
    1'''21.查找模块的顺序:31.当前目录:Python会首先搜索执行脚本所在的当前目录,也就是运行程序的工作目录。42.内置模块:如果在当前目录没有找到对应的模块,Python会接着搜索内置模块,这些模块是Python自带的,无需额外安装。53.sys.path中的目录:如果在内......
  • 1.1 顺序结构 参考代码
    P1001A+BProblem#include<cstdio>intmain(){inta,b;scanf("%d%d",&a,&b);printf("%d\n",a+b);return0;}P5703[深基2.例5]苹果采购#include<cstdio>intmain(){inta,b;scanf("......
  • 顺序栈的实现
    /*顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序表中的位置。做法:以top=0表示空栈,另外设指针base指示栈底元素在顺序栈中的位置。当top与base的值相等时,表示空栈。*/#inc......
  • 1.C++入门&&简单顺序结构-习题
    1.C++入门&&简单顺序结构1.计算(a+b)*c的值 inta,b,c; cin>>a>>b>>c; cout<<(a+b)*c;2.带余除法 inta,b; cin>>a>>b; cout<<a/b<<""<<a%b; //C++中取余结果正负只与%前面的数有关系 cout<<5%2<<endl......
  • 模拟ArrayList(顺序表)的底层实现
    模拟ArrayLIst的底层实现packagecom.tedu.api04.list;importjava.util.Objects;/***@authorLIGENSEN*Date:2023/7/2011:35*/publicclassArrayListDemo{publicstaticvoidmain(String[]args){ArrList<String>list=newArrList<>......
  • Spring Boot配置文件加载顺序
    项目内部配置文件springboot启动会扫描一下位置application.properties或者application.yml文件作为springboot的默认配置文件1、file:./config/2、file:./3、classpath:/config/4、classpath:/加载顺序可以通过启动命令spring.config.location修改java-jarspring-boot-......
  • python2字典顺序出错
    Python2字典顺序出错在Python2中,字典(Dictionary)是一种无序的集合数据类型,其中的元素是以键值对(key-valuepair)的形式存储的。然而,Python2中的字典是无序的,这意味着字典中的元素没有特定的顺序。这一特性在某些情况下可能会导致代码运行结果的不确定性,给程序员带来一些困惑。字典......
  • c++入门以及简单顺序结构-习题
    1.c++入门以及简单顺序结构-习题1.计算(a+b)*c的值inta,b,c;cin>>a>>b>>c;cout<<(a+b)*c;2.带余除法inta,b;cin>>a>>b;cout<<a/b<<""<<a%b;//c++中取余结果正负只与%前面的正负有关系 cout<<5%2<<endl;//输出1 c......
  • IfcLanguageId
    IfcLanguageId类型定义IfcLanguageId标识自然语言文本所用的语言。它使用语言标签来识别语言。 注:标签应符合RFC5646中表达的互联网工程任务组(IETF)语言标签。一致性程序应支持“简单语言”子标签和“语言区域”标签格式。简单语言标签en(英语)、de(德语)、fr(法国)或ja(日语)的示例......