如何启用icc/icpc警告?

Con*_* He 8 c c++ intel icc

我在Linux上安装了Intel Compiler composer_xe_2013_sp1.3.174.我对icc警告感到困惑.使用简单的程序main.c提供icc,如下所示:

int main(int argc, char **argv) {
  int a = 1;
  unsigned int b = -22;
  if (b = a) {

  }
}
Run Code Online (Sandbox Code Playgroud)

我用命令编译了文件:icc -Wall main.c.令人惊讶的是,该命令在没有任何警告的情况下静默工作.我是否必须打开icc上的警告开关?谢谢

pav*_*von 12

英特尔编译器确实没有像gcc那样的警告预设(至少在Linux上).主要警告选项是-wnn可以是0到5.默认值是1,而4和5在Linux上没有意义.它还支持一些像-Wall和的gcc选项-Wextra.然而:

  • -Wall 你发现,与gcc相比,它是非常简约的
  • -w2-w3启用一些有用的诊断,但也有很多垃圾评论
  • -diag-disable:remark 删除垃圾邮件,但也有很多有用的诊断

最终-w3 -diag-disable:remark是icc最好的预设,但它仍然比它更简约gcc -Wall.相反,您需要从一组最小的警告开始并构建自己的警告,或者从最大的诊断开始并禁用任何令人讨厌的使用-wd.

建立

第一种方法的主要缺点是英特尔并没有真正记录其大部分警告,因此很难知道什么是可用的.但是,它确实支持许多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
Run Code Online (Sandbox Code Playgroud)

这不完全匹配gcc -Wall.GCC和ICC实施上述警告之间存在差异.我也无法找到符合这些GCC警告的ICC选项:

-Wformat-contains-nul
-Wunused-label
-Wstrict-overflow
-Wvolatile-register-var
Run Code Online (Sandbox Code Playgroud)

而且我故意将它们排除在外,因为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
Run Code Online (Sandbox Code Playgroud)

裁减

如果GCC奇偶校验不是一个问题,那么了解ICC警告的最简单方法就是启用它们,然后决定是否喜欢它们.如果您不喜欢警告,可以使用它的诊断编号来禁用它,该诊断编号通常具有GCC选项的更细化程度.

icpc -w3 -wd1418,2259
Run Code Online (Sandbox Code Playgroud)

以下是我过去看到过的一些诊断信息:

  • 383:值复制到临时,引用临时使用
  • 869:从未引用参数"*"
  • 981:操作数以未指定的顺序进行评估
  • 1418:没有事先声明的外部函数定义
  • 1572:浮点平等和不等式比较是不可靠的
  • 2259:非指针转换可能会丢失有效位
  • 11074:限制最大大小(或最大总大小)禁止内联
  • 11076:要获得完整报告,请使用-qopt-report = 4 -qopt-report-phase ipo

但我鼓励你从他们开始,并削减那些对你的代码库有问题的那些.


小智 1

一般来说,您开发的小程序的最佳编译选项是 -Wall -Wextra -std=c11 -pedantic

与警告开关的名称相反,Wall 并未实际激活所有警告;您可以同时使用 Wall 和 Wextra 来获取大部分重要警告。

-std 开关设置代码使用的标准;最新的是 C11,因此 std=c11。迂腐是一种向编译器发出信号的方式,表明您想要编写不使用特定于编译器的扩展的程序。Pedantic 需要 std 开关,并对任何语法等发出警告。不符合std规定的标准。最后,如果您希望在使用编译器扩展时出现错误而不是警告,请改用 -pedantic-errors。*

(* - 学究式不会警告使用非标准库(如 conio.h)

现在,如果您使用 Wall Wextra std=c11 pedantic 编译程序,您应该收到 1 个警告:

警告:第 4 行 - 建议在真值周围添加括号(十分之九,这意味着您在比较上下文中使用 = 代替 ==)。

如果您修复该警告,您将收到另一个警告:警告:第 4 行 - 有符号整数和无符号整数之间的比较,无需强制转换。

添加显式强制转换或将 b 更改为普通 int 将解决此警告。

  • 这个答案适用于gcc;不是国际刑事法院。 (3认同)