xlC 警告,"The NOSTRICT option has the potential to alter the semantics of a program"

xlC warning, "The NOSTRICT option has the potential to alter the semantics of a program"

我正在 GCC Compile Farm 和 GCC119 上进行测试。 GCC119 是带有 xlC 13.1 编译器的 AIX 机器。我对平台和编译器知之甚少。

当我在 xlC 下构建时:

$ CXX=xlC gmake CXXFLAGS="-DNDEBUG -g2 -O3 -qrtti" -j 8
xlC -DNDEBUG -g2 -O3 -qrtti -c cryptlib.cpp
xlC -DNDEBUG -g2 -O3 -qrtti -c cpu.cpp
...
xlC -DNDEBUG -g2 -O3 -qrtti -c hmac.cpp
1500-036: (I) The NOSTRICT option (default at OPT(3)) has the potential to alter the 
semantics of a program.  Please refer to documentation on the STRICT/NOSTRICT option
for more information.
...

编译器的 IBM 手册位于 Compiler Reference v13.1。它没有提到 STRICTNOSTRICT。基于关键字搜索最接近的是 -qkeyword=restrict 生效时对 __C99_RESTRICT 的讨论。此外,没有手册页:

$ man NOSTRICT
Manual entry for NOSTRICT not found or not installed.
$ man 3 NOSTRICT
There is not an entry for NOSTRICT in section 3.
$ man STRICT
Manual entry for STRICT not found or not installed.
$ man 3 STRICT
There is not an entry for STRICT in section 3.
$ man OPT
Manual entry for OPT not found or not installed.
$ man 3 OPT
There is not an entry for OPT in section 3.

当我使用 -qflag=w 编译时,警告消失了,所以我可以使用的信息更少。 (库和程序使用 -qflag=w 编译得很干净)。

我有两个问题。首先,xlC 到底在抱怨什么?其次,是否可以让 xlC 告诉我它抱怨的源文件和行号?

如果您要查找有关 -qstrict 和 -qnostrict 选项的信息,您应该在 HTML format, or on page 349 (if you're going by page numbers), or page 367 (if you're using the PDF page advancer) in PDF format 中找到它。

由于您使用的是 -O3 (OPT(3)),如消息所述,默认情况下 -qnostrict 选项有效,这意味着与使用 -qstrict 编译相比,更积极的优化是执行以创建更快的可执行文件,代价是在程序中有轻微的语义差异。查看文档(复制在下面)以了解其具体含义;如果下面提到的任何差异对您很重要,请使用 -O3 -qstrict 进行编译以防止出现这些语义差异,但您的应用程序性能可能不会那么好。

启用 -qnostrict 后,将启用以下优化:

  • 可能导致异常的代码可能会重新排列。相应的异常可能发生在不同的执行点,也可能根本不发生。 (编译器仍然会尽量减少这种情况。)
  • 浮点运算可能不保留零值的符号。 (要确保保留此符号,您还需要指定 -qfloat=rrm、-qfloat=nomaf 或 -qfloat=strictnmaf。)
  • 可以重新关联浮点表达式。例如,如果速度更快,(2.0*3.1)4.2 可能会变为 2.0(3.1*4.2),即使结果可能不相同。
  • -qfloat 选项的fltint 和rsqrt 子选项已打开。您也可以使用 -qstrict 选项或 -qfloat 的 nofltint 和 norsqrt 子选项再次关闭它们。在指定较低级别或未指定优化的情况下,这些子选项默认情况下处于关闭状态。

您的 man 命令将无法正常工作,因为 NOSTRICTSTRICTOPT 是编译器选项,不能与 man 一起使用。为了查看编译器手册页,您需要使用 man xlC.

没有与此信息消息关联的源文件和行号信息,因为它是针对所有使用 -O3 编译的文件的一般消息。

如果您想就文档(包括手册页、在线文档等)提供反馈,IBM is looking for feedback

P.S。 IBM XL C/C++ for AIX V13.1 的完整文档可以在 HTML format or PDF format 中找到。有几个 "books" 组成了完整的编译器文档,包括编译器参考。