Intel 编译器并没有像 gcc 那样提供良好的警告预设(至少在 Linux 上)。主要警告选项是-wn
其中n可以是0到5。默认为1,4和5在Linux上没有意义。它还支持一些 gcc 选项,例如-Wall
and -Wextra
。然而:
-
-Wall
正如您所发现的,与 gcc 相比非常简约
-
-w2
and -w3
启用一些有用的诊断,但也有很多垃圾评论
-
-diag-disable:remark
删除垃圾邮件,但也删除许多有用的诊断信息
到底-w3 -diag-disable:remark
是 icc 拥有的最好的预设,但它仍然比gcc -Wall
。相反,您需要从最少的警告集开始并构建自己的警告,或者从最大的诊断开始并禁用任何令人讨厌的使用-wd
.
Build Up
第一种方法的主要缺点是英特尔并没有真正记录其大部分警告,因此很难知道可以启用哪些内容。但是,它确实支持许多 GCC 命令行标志,因此 GCC 文档是一个很好的起点。例如,以下是相对接近的设置g++ -Wall
,如果您想使用其中一个进行开发并且很有可能使用另一个进行干净的构建,那么这很方便:
icpc -Wall -Warray-bounds -Wchar-subscripts -Wcomment -Wenum-compare -Wformat -Wuninitialized -Wmaybe-uninitialized -Wmain -Wnarrowing -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type -Wsign-compare -Wsequence-point -Wtrigraphs -Wunused-function -Wunused-but-set-variable -Wunused-variable -Wwrite-strings
这不是完全匹配gcc -Wall
。 GCC 和 ICC 对上述警告的执行存在差异。我也无法找到 ICC 选项来匹配这些 GCC 警告:
-Wformat-contains-nul
-Wunused-label
-Wstrict-overflow
-Wvolatile-register-var
我故意忽略了这些,因为 ICC 版本比 GCC 版本更垃圾:
-Wstrict-aliasing So broad that any use of polymophism will cause this warning
-Wswitch Requires a default even if you have cases for all enumeration values
裁减
如果 GCC 奇偶性不是问题,那么了解 ICC 警告的最简单方法就是启用所有警告,然后决定是否喜欢它们。如果您不喜欢警告,可以使用它的诊断编号来禁用它,这通常比 GCC 的选项具有更多的粒度。
icpc -w3 -wd1418,2259
以下是我过去见过的一些被禁用的诊断:
- 383:值复制到临时,引用临时使用
- 869:从未引用参数“*”
- 981:操作数按未指定的顺序求值
- 1418:没有事先声明的外部函数定义
- 1572:浮点相等和不等比较不可靠
- 2259:非指针转换可能会丢失有效位
- 11074:内联被限制最大大小(或最大总大小)禁止
- 11076:要获取完整报告,请使用 -qopt-report=4 -qopt-report-phase ipo
- 161:禁用对无法识别的编译指示的警告
但我鼓励您从所有这些开始,只减少对您的代码库有问题的那些。