编译器玄学报告第四期——成也warning,败也warning

Posted 裸机思维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译器玄学报告第四期——成也warning,败也warning相关的知识,希望对你有一定的参考价值。

忙活了ban


【说在前面的话】


今天一大早醒来,就看到嵌入式大号把最新版本的MDK 5.33给“挂了”出来:

【编译器玄学报告】第四期——成也warning,败也warning

想不到国内嵌入式圈子还有这么多跟我一样天天盯着MDK编译器不放恨不得第一个发现Bug的人——既然被人捷足先登了,就不妨来看看究竟是个怎样的Bug。


在文章的一开头,文章作者直接而清晰的给出了结论:


用最新版的Keil for ARM 5.33版本做407开发板的开发,自己创建的工程怎么都没法正常编译,不是有错就有几十个警告。 
gaoyang9992006,公众号:嵌入式ARM


这里“ 有错误几十个警告”显然预示着这是一个 MDK的大瓜,看来必须要吃!
这里的错误和警告, 对一般程序员来说,应该就是编译结果的 Error和Warning吧?作为一个跟文章作者一样有代码洁癖的 处女座(我的确是处女座), Error和Warning绝对不能忍

【编译器玄学报告】第四期——成也warning,败也warning


MDK 居然搞事情,看我们 干它 就完了!

【复现问题】

既然是要吃瓜,首先第一步当然是复现问题,顺着原作者提供的步骤,首先就是要准备环境:

【编译器玄学报告】第四期——成也warning,败也warning


MDK 5.33,新鲜冒着热气,木毛病。

接着是下载作者所使用的芯片支持包,很遗憾的是,作者使用的芯片支持包无法从MDK自带的Pack Installer里直接下载获得——显然芯片厂家还没有使用MDK作为自己的正式芯片发布渠道——只能去官网下载……

然而……作者提供的链接居然不能直接点开……(是纯文字)

【编译器玄学报告】第四期——成也warning,败也warning

这……还要我自己找……还好问题不大,有www.arterytek.com和AT32F4的两个关键字,很容易找到:

【编译器玄学报告】第四期——成也warning,败也warning


【编译器玄学报告】第四期——成也warning,败也warning


这里,我放下完整的链接:

http://www.arterytek.com/download/Pack_Keil_AT32F4xx_CH_V1.3.5.zip


【建立工程】


安装好芯片支持包以后,我们开始建立工程。按照,原文,我们需要选择一个AT32F407的芯片:


【编译器玄学报告】第四期——成也warning,败也warning


可惜截图里作者没有提到具体选哪个芯片型号,因为我看到的界面是这样的:


【编译器玄学报告】第四期——成也warning,败也warning


也就是说,在 AT32F407下还有很多子型号……考虑到子型号差异可能跟这个bug关系不大,所以作者省略了这部分信息吧。于是我也随便选了一个,进入到RTE配置环节。


【RTE配置】


在原文中的截图中,我们注意到,RTE配置中,作者只选择了 GPIO模块,由于可能缺失了一些必要的支持库,MDK通过两种方法给出了明确的Warning信息:
  • 在列表中给出黄色标注,提示哪个组件有问题

  • 在下面的Validation Output中给出了惊叹号,并在Description中给出了明确的说明

【编译器玄学报告】第四期——成也warning,败也warning

这里,我也复现了同样的情况,所以放大一下:

【编译器玄学报告】第四期——成也warning,败也warning


由于我之前对MDK比较熟悉:知道MDK会聪明的给出警告,同时也知道,很多情况下,只要单击 Resolve按钮,MDK就会自己替你解决问题:


【编译器玄学报告】第四期——成也warning,败也warning


果然,在单击Resolve后Warning消失了,所有选中的模块都变成了绿色。


我观察了下原文,没有提到这里的细节,估计是作者也顺手解决了吧。(然而事后证明我大意了,没有闪)


【工程编译】


在加入了main.c后,我也开始了编译。然而……我翻车了?并没有出现严重的编译错误:

【编译器玄学报告】第四期——成也warning,败也warning


什么情况?说好的瓜呢? 0 Error 5 Warning(s)

【编译器玄学报告】第四期——成也warning,败也warning

突然想起来, 是不是因为我自作聪明在RTE配置的时候处理了MDK给我的warning——单击了Resovle
为了验证我的猜想,我重新配置了RTE,编译后结果如下:

【编译器玄学报告】第四期——成也warning,败也warning


我擦,来了来了,4个Error,60个Warning!虽然跟原文88个warning比少了不少……但至少算是复现了问题。

但,说好的瓜呢?这明显是个MDK通过Warning告知了我们随手Resolve就可以解决下的问题,算不上MDK的Bug吧……



【就事论事说Warning】


好吧,瓜没吃成,我们再来看看之前剩下的5个warning,毕竟原文作者说用armcc(arm compiler 5)就可以做到 0 Error 0 Warning。

我突然想起来以前认识的一个大佬对我说过这样的话:

armcc不报告很多warning恰恰是因为armcc其实不是一个很优秀的编译器,很多主流编译器,比如 gcc,llvm,IAR都会注意到的值得warning的问题,armcc都会忽略……


既然可以掩耳盗铃,我们不妨试试看把Arm Compiler 6的warning模式变得跟 armcc一样:

【编译器玄学报告】第四期——成也warning,败也warning


把这里的 All Warnings改为AC5-like Warnings:

【编译器玄学报告】第四期——成也warning,败也warning


编译下看看:

【编译器玄学报告】第四期——成也warning,败也warning



【编译器玄学报告】第四期——成也warning,败也warning


【遗憾的结语】

忙活了半天,没吃上瓜,我内心是很遗憾的。


虽然我常年给MDK找碴,但不管咋说, MDK已经通过颜色和文字把他检测到的问题告知我们了啊?硬要说这是MDK的问题, MDK也在文档里写清楚这种Warning机制啦……

【编译器玄学报告】第四期——成也warning,败也warning



咋说呢……要我说,要解决这类问题,最好的方案是:
  • MDK必须每天把自己的文档拆成小文章,推送给每个用户,而且有些内容还要常年重复推送,让大家不至于漏掉……


最后关于大家对armcc的谜之信任,我还是想重复下那句话:


armcc不报告很多warning恰恰是因为armcc其实不是一个很优秀的编译器,很多主流编译器,比如 gcc,llvm,IAR都会注意到的值得warning的问题,armcc都会忽略……




原创不易,

如果你喜欢我的思维、觉得我的文章对你有所启发,

请务必 “点赞、收藏、转发” 三连,这对我很重要!谢谢!


欢迎订阅 裸机思维



以上是关于编译器玄学报告第四期——成也warning,败也warning的主要内容,如果未能解决你的问题,请参考以下文章

成也科幻,败也科幻

成也抽象,败也抽象。何哉?

面试了一位7年软件测试工作者:成也“7”年,败也“7”年

比亚迪成也闭环,败也闭环:4星|《财经》2018年第12期

成也陈乔恩,败也东方不败霍建华版《笑傲江湖》全剧评

前端面试一位7年工作者:成也“7”年,败也“7”年