c++ - 如何打开 icc/icpc 警告?

标签 c++ c compiler-warnings icc compiler-options

我在 Linux 上安装了英特尔编译器 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 上的警告开关吗?谢谢

最佳答案

Intel 编译器并没有像 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:限制最大尺寸(或最大总尺寸)禁止内联
  • 11076:要获得完整报告,请使用 -qopt-report=4 -qopt-report-phase ipo
  • 161: 禁用对无法识别的编译指示的警告

但我鼓励您从所有这些开始,只减少对您的代码库有问题的那些。

关于c++ - 如何打开 icc/icpc 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27343360/

相关文章:

scala - 使用 -Ywarn-unused 时从 Scala 中的分析中排除类型证据参数

c++ - 如何从传递的数组中正确构造 CUSP coo 矩阵

c - 将 128 位寄存器从汇编传递给 C 函数

C:从一个文件中读取,排序,然后输出到另一个

c++ - gcc 多行注释警告

c++ - 属性警告未使用结果相当于 Visual C

c++ - 实现《战地》3's std::vector swap trick to "删除/添加“一个元素

c++ - 我可以在编译时不知道大小的情况下在堆栈上分配 `std::array` 吗?

c++ - MFC C++ 在主线程上放置 1000 毫秒 sleep ?

Char 指针 NULL 终止和内存分配