正在进行的项目中有个网络模块,需要在上位机将数据包加密,然后在设备端将数据包解密。两者使用的加密方法是可逆的(大概是异或之类的)。在我测试时,发现设备上解出来的数据不正常,得不到上位机未加密前的数据。因为这个模块在其它项目一直使用,一直OK,现在出问题了,很郁闷。而且该模块嵌入到其它大的功能模块,后来将加密、解密模块独立出来测试。当定位到解密这个点上,都已经过了大半天了。

在无头绪时,将代码纳入以前写的工程库在VS中测试,发现一切正常。结论是windows编译后运行结果正确,但linux却不正确,这又让我郁闷了。后来又试了不同的linux,结果有的成功,有的还是有错误。再细查,原来所用的gcc版本不同导致运行结果不同。在最新的4.8版本中,解密后的数据不对,但在4.6版本却是正确的。

核心的代码实际上使用了宏定义,示例如下:

#define M_NUM 0xdeadbeef
#define XOR(m1, m2, m3) (m1*M_NUM^m2^m3)
#define FOOBAR(f, u, c, k) (f ^ XOR(u,c,k))

单从代码上,我无法解释为什么在不同的gcc得到的结果不同。在我的知识水平范围同,我无从修改代码,姑且认为是编译器的问题(代码有问题赖编译器可不是好习惯)。既然是编译器版本的差别,只能曲线找方法。我的方法是将实现加密、解密的文件单独使用4.6版本的gcc编译成lib,然后其它代码模块调用这个库的函数,这样避免了用高版本的编译器编译所有文件。事实说明,这样的可行的,虽然方法在专业人士或领导眼中不屑一顾,但我不说,又有谁会遇到这种问题呢?我又岂能为了这个小模块而将移植好的内核、驱动、根文件系统工具重新使用4.6版本的gcc编译过一次呢?

2015.10.19的PS:
如今因为修正另外的代码分支代码警告而遇到这个代码片段,在VS2010、gcc4.4、gcc4.8上的编译结果均不相同。经仔细揣摩仅的几行语句,发现是同一语句对同一变量进行多次运算造成的未定义行为。示例代码:
*ptr++ = FOOBAR(*ptr, f, u, c);
类似学校经常考的i=i++这种题目。这种语句的结果因编译器不同而不同。编译器警告提示为:
warning: operation on ‘ptr’ may be undefined [-Wsequence-point]
有兴趣的可以搜索一下sequence-point这个关键词,网上有很多资料。

李迟,2015年1月17日,中午

遇到一个gcc编译器版本导致的运行结果有差异的问题相关推荐

  1. 如何查看GCC编译器版本

    查看GCC编译器版本

  2. 查看gcc编译器版本

    我们在windows下DS5中编译时使用GCC交叉编译器,但是在ubuntu时也需要使用GCC编译器,这时最好时保持版本一致,所以就需要查看windows下版本,如下图,在按装的文件夹中找到对应得文件 ...

  3. 如何升级Symbian Carbide C++的GCC编译器版本

    参考资料: How to use GCCE 4 with Symbian SDKs Carbide C++的编译器 在Symbian开发工程中,Carbide C++是非常好用的开发工具,目前提供GC ...

  4. linux如何切换gcc版本,切换GCC编译器版本

    当前版本信息 root@ubuntu:runninglinuxkernel_4.0# aarch64-linux-gnu-gcc -v Using built-in specs. COLLECT_GC ...

  5. linux gcc编译只能编译一条,请教一个gcc编译器的问题啊

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 楼主要跑分子动力学? 放弃GNU编译器,改用Intel编译器吧. 另外gromacs不用CMake也能编译. export CC=icc export C ...

  6. 不同版本GCC编译器之间的切换

    编译器版本有时太高,好多软件是运行会报错,所以最好安装多个版本的gcc编译器,用的时候来回进行切换 yum -y install gcc yum -y install gcc-c++ 这是安装gcc命 ...

  7. 手把手教你搭建Linux开发环境(VMware+Ubuntu)(四)——gcc编译器的安装和使用

    上回,我们已经把vim的安装.配置和使用说完了,今天我们就来谈谈Linux下gcc编译器的安装和使用. PS:还不会vim的同学,建议移步: Ubuntu下vim编辑器的安装.配置和使用 1.查看gc ...

  8. GCC编译器——GCC编译器的简介

    以下内容源于C语言中文网的学习与整理,如有侵权请告知删除. 参考内容 (1)C语言程序设计门户网站(入门教程.编程软件) (2)GCC官方文档网址 一.GCC编译器的由来 谈到 GCC编译器,就不得不 ...

  9. 用gcc编译器运行c语言程序

    用gcc编译器运行c语言程序 (1)首先要检查是否安装了gcc编译器 [root@localhost ~ ]# rpm -qa|grap gcc 如果显示的内容里有下面的结果则已安装了gcc编译器 g ...

最新文章

  1. Joomla和Drupal简介
  2. Java面向对象(二)面向对象的特征 --- 封装 、 继承、 多态
  3. iPhone上运行Linux也要来了
  4. 在同一台机器上启动多个JBoss A-MQ JVM
  5. 刷抖音看到 Python 工程师的工资条后,我沉默了...
  6. 对称机密算法与非对称机密算法
  7. cif是目的港交货吗_刚接手出口业务,搞不懂FOB? CIF? 为你科普→
  8. 95-180-050-源码-Watermark-允许固定数量延迟的分配器(BoundedOutOfOrdernessTimestampExtractor)
  9. SpringCloud Stream操作消息队列
  10. 多个Excel合并为一个Excel表
  11. Exchange 2010升级到Exchange 2016汇总
  12. 字节跳动员工晒出税后工资,网友:怀疑你是日薪
  13. 数字图像处理与Python实现-颜色空间转换-RGB颜色空间与YIQ颜色空间转换
  14. Spring框架学习 思维导图
  15. PHP+MySQL实现用户登录注册API接口
  16. 中文转 拼音字母、全拼 工具类
  17. 安徽省计算机应用能力考试证书,合肥信息技术职业学院1084名学子成功获得了全国信息化应用能力考试合格证书...
  18. 明哥复习MyBatis(1)
  19. P1209 [USACO1.3]修理牛棚
  20. K13140 环形跑道(简化版)

热门文章

  1. python 知识点怎么办_python中的小知识点
  2. 帕特·基辛格被任命为英特尔CEO已有一年
  3. 瑞信中国前CEO唐臻怡加盟商汤科技出任副总裁
  4. 特斯拉车顶维权女车主称被恐吓 将公布特斯拉提供的不完整数据
  5. 开着开着,Model S天窗飞了!特斯拉回应...
  6. 制动方面存隐患 上汽通用召回2215辆别克、雪佛兰等车型
  7. 女子多年未住别墅成剧组拍摄地,网友:看个剧才想起自己还有栋别墅
  8. 荣耀20s真机谍照曝光:开孔全面屏+后置竖排三摄
  9. “天天快报”涉黄被下架?官方回应:不是我 是山寨版APP
  10. 首次击败美国!2019《财富》世界500强公布:129家中国公司上榜