上来发个牢骚,骂骂CPU或编译器 400 请求报错 -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

上来发个牢骚,骂骂CPU或编译器 400 请求报错 

kun坤 2020-05-29 22:50:53 53

哈,@一下 ,@周翼翼对我的评价,我是个不相信编译器的人。这次又倒霉了。 不过目前还不能确定是编译器的错。一个代码,逻辑没问题,上板子跑就出错。该语句放到一个函数内执行,就正确。 典型编译优化过度,或CPU流水线太深数据跟不上的错。 吃过N多次亏了。 继续保持怀疑编译器的心态,写代码。

aa >>=X; d = (short*)&aa; p->a |=( !p->b&&(( (c== 0)&& (iabs(d[0])>>1 == 0) &&  (iabs(d[1])>>1 == 0)))) << e; //出错。 //该成 void sub_func(P*p,int c,short d,int e){ p->a |=( !p->b&&(( (c== 0)&& (iabs(d[0])>>1 == 0) &&  (iabs(d[1])>>1 == 0)))) << e; } //再调用这个子函数, aa >>=X; d = (short)&aa; sub_func(p,c,d,e); //p->a的值就正确。实际上硬件跟踪,d[1]的数据未到位。 //我修改了变量名,请大家不要怀疑代码的逻辑问题。呵呵。

准确说也不能算是编译器出问题。毕竟是比较标准的ARM编译器。更怀疑是芯片设计工艺的问题,导致寄存器数据跟不上。这类情况吃过不少苦。优化过头了。  

 
编译器 C++ 芯片
分享到
取消 提交回答
全部回答(1)
  • kun坤
    2020-05-30 14:00:18

    希望楼主能多分享下优化心得哈

    ######心得?就是怀疑一切。我相信在Soc公司里,开发driver,特别是网络,电源管理,总线方面的朋友都知道。spec有时只能当草纸用。

    ######反汇编下代码,看看编译结果有无问题.######去掉编译优化选项再试试######会不会跟子函数传递形参有关?###### 你用的是什么编译器? gcc for arm?你这个问题很可能是编译器的问题.

    gcc不可靠的对容易有歧义和很复杂的表达式,编译出来的东西是错误的.以前遇到过.

    VC的或者商用编译器就好多了. ######这么说,反汇编已经检查过了吧,如果确定汇编也没有问题的话,那就只能是硬件层的了。 编译器一般情况下是不会犯错的,因为它无论怎么优化,第一个原则就是正确性,在原程序中会被执行的代码在结果里也一定会被执行。然而,对于不同的芯片,实现上可能会有一定的差异,对编译器也有不同程度的裁剪,但它毕竟只是个程序。再者,芯片实现越来越复杂,内部指令到底是个怎么执行流程,连代码自己都不能知道,何况是编译器和程序员。######

    引用来自“ZeroOne”的答案

    你用的是什么编译器? gcc for arm?你这个问题很可能是编译器的问题. gcc不可靠的对容易有歧义和很复杂的表达式,编译出来的东西是错误的.以前遇到过. VC的或者商用编译器就好多了.
    上ARM 1GHz的Soc跑的准“固件”。我没办法用VC。而且是android 的NDK。 ######

    引用来自“晓寒”的答案

    这么说,反汇编已经检查过了吧,如果确定汇编也没有问题的话,那就只能是硬件层的了。 编译器一般情况下是不会犯错的,因为它无论怎么优化,第一个原则就是正确性,在原程序中会被执行的代码在结果里也一定会被执行。然而,对于不同的芯片,实现上可能会有一定的差异,对编译器也有不同程度的裁剪,但它毕竟只是个程序。再者,芯片实现越来越复杂,内部指令到底是个怎么执行流程,连代码自己都不能知道,何况是编译器和程序员。
    目前怀疑是函数过早跳出,对应寄存器的值没有有效传递给外部变量前,被堆栈弹出的数据覆盖,转而将数据写出变量时导致错误。虽然问题解决了。但是具体原因我还需要查一下。当然可能有另外个错误,就是进入计算和判断的变量,在寄存器传递为有些写入前,就被使用。 ######这个问题目前查清楚了,让小朋友看反汇编,让他自己理解。还不错。把问题向我汇报清楚了 。也希望大家注意, android下的C编译器存在错误。尽量把C代码写简单点。上述错误是C编译器在优化模式下的逻辑错误。
    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程