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

2021-02-07 10:00:13 浏览数 (1)

忙活了ban

【说在前面的话】


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

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

单击这里阅读原文

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

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

这里“有错误几十个警告”显然预示着这是一个MDK的大瓜,看来必须要吃!

这里的错误和警告,对一般程序员来说,应该就是编译结果的 Error和Warning吧?作为一个跟文章作者一样有代码洁癖的处女座(我的确是处女座),Error和Warning绝对不能忍

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

【复现问题】


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

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

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

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

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

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

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

【建立工程】


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

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

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

【RTE配置】


在原文中的截图中,我们注意到,RTE配置中,作者只选择了 GPIO模块,由于可能缺失了一些必要的支持库,MDK通过两种方法给出了明确的Warning信息:

  • 在列表中给出黄色标注,提示哪个组件有问题
  • 在下面的Validation Output中给出了惊叹号,并在Description中给出了明确的说明

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

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

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

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

【工程编译】


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

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

突然想起来,是不是因为我自作聪明在RTE配置的时候处理了MDK给我的warning——单击了Resovle

为了验证我的猜想,我重新配置了RTE,编译后结果如下:

我擦,来了来了,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一样:

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

编译下看看:

【遗憾的结语】


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

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

咋说呢……要我说,要解决这类问题,最好的方案是:

  • 每个下载了MDK的中国用户,都被强制要求关注一个MDK公众号(可惜还没有)
  • MDK必须每天把自己的文档拆成小文章,推送给每个用户,而且有些内容还要常年重复推送,让大家不至于漏掉……

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

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

0 人点赞