GCC版本不同导致程序执行结果迥异

系统其它 专栏收录该内容
29 篇文章 0 订阅

之前运行正常的一段代码,在升级了编译工具链后出现异常,最后发现是gcc的版本不同,导致编译出来的代码执行结果迥异。如下的代码为根据这个问题写的一段简单的测试程序。src指向一段数据,此段数据为长度+内容的组合(第一个字节为长度,其后为此长度的内容)。


unsigned char get_length(unsigned char **src_p)
{
    unsigned char ret = **src_p;
    (*src_p)++;

    return ret;
}
int main(void)
{
    unsigned char data[] = {0x01, 0x1, 0x2, 0x3, 0x4};
    unsigned char *src = data;

    src += get_length(&src);
    return 0;
}

说一下前提条件:src的第一个长度字节为0x01,get_length函数返回1。引起歧义的是这句代码:src += get_length(&src)。其中有两个意义:

1)src指针最终+1。等式左侧的src忽略get_length函数内部的++操作,src加上get_lengthh函数返回值1。
2)src指针最终+2。src指针现在get_length内部加1,返回之后在加上get_length的返回值1。


根据gcc版本不同,以上的两者结果都可能出现。

在CentOS 7.3上测试,gcc版本为4.8.5,为第一种情况 1),src最终增加1。
$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

$ gcc -v
gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
$


在Ubuntu 16.10系统上测试,gcc版本为7.2.0,为第二种情况 2),src最终增加2。

$ cat /etc/issue
Ubuntu 16.10 \n \l

$ gcc -v
gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3)

为保证代码的兼容性,main函数改成如下形式:

int main(void)
{
    unsigned char data[] = {0x01, 0x1, 0x2, 0x3, 0x4};
    unsigned char *src = data;
    int len;

    len = get_length(&src);
    src += len;
    
    return 0;
}

 

 

  • 1
    点赞
  • 3
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值