如何启用icc / icpc警告?

时间:2014-12-07 13:56:12

标签: 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) {

  }
}

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

2 个答案:

答案 0 :(得分:11)

英特尔编译器确实没有像gcc那样的警告预设(至少在Linux上)。主要警告选项是-wn,其中n可以是0到5.默认值是1,而4& 5在Linux上没有任何意义。它还支持一些gcc选项,例如-Wall-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

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

-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:限制max-size(或max-total-size)
  • 禁止内联
  • 11076:要获取完整报告,请使用-qopt-report = 4 -qopt-report-phase ipo

但我鼓励你从一开始就把它们放在一边,然后削减那些对你的代码库有问题的那些。

答案 1 :(得分:1)

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

与警告开关的名称相反,Wall实际上并未激活所有警告;你使用Wall和Wextra来获得大部分重要警告。

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

(* - pedantic没有警告使用像conio.h这样的非标准库)

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

警告:第4行 - 在truthy值周围建议括号(10个中的9个,这意味着您在比较上下文中使用=而不是==)。

如果你修正了这个警告,你会收到另一个警告: 警告:第4行 - 没有强制转换的有符号和无符号整数之间的比较。

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