-qflttrap (-ftrapping-math)

适用的调用

表 1. 接受给定选项的调用
选项 xlc (编译 C) xlC (编译 C++) xlclang(编译 C) xlclang++(编译 C++)
-qflttrap
-ftrapping-math    
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表

类别

错误检查和调试

等效编译指示

表 2。 两个类别的调用的编译指示等效项
xlc/xlC 和其他遗留的调用命令 xlclang/xlclang + + 调用命令
#pragma 选项 [no] flttrap

用途

确定在运行时要检测哪些类型的浮点异常。

当发生相应的异常时,程序接收到 SIGTRAP 信号。

语法

读取语法图跳过可视语法图 -f notrapping-mathtrapping-math
读取语法图跳过可视语法图 -q noflttrapflttrap=:inexactinexinvalidinvoverflowovunderflowundzerodividezeroenableenimpreciseimpnanq

缺省值

-fnotrapping-math-qnoflttrap

指定不带子选项的 -qflttrap 选项等同于 -qflttrap=overflow:underflow:zerodivide:invalid:inexact

参数

注: 只能使用 -qflttrap 指定以下子选项。
启用, en
当发生指定的异常 (overflowunderflowzero划invalidinact) 时, 插入陷阱 。 如果要在不修改源代码的情况下打开异常捕获,则必须指定此子选项。 如果发生任何指定的异常,那么将向具有该异常的精确位置的进程发送 SIGTRAP 或 SIGFPE 信号。 如果 imprecise 生效,那么陷阱将不会准确报告发生异常的位置。
不精确
启用对指定异常的不精确检测。 编译器在代码块之后并在 main 程序返回之前生成指令,以检查是否发生了任何指定的异常 (overflowunderflowzero分岐无效不精确)。 如果发生异常,那么将在浮点状态和控制寄存器中设置异常状态标志,但未确定异常的确切位置。 由于在每次浮点操作和函数调用后都不会生成指示信息以检查异常,因此此子选项可使性能略有提高。
不精确inex
启用浮点不精确操作的检测。 如果未同时指定 imprecise ,那么编译器将在每个浮点操作和函数调用后生成指令,以检查是否发生了不精确的操作异常。 如果发生浮点不精确操作,那么将在浮点状态和控制寄存器 (FPSCR) 中设置不精确操作异常状态标志。
无效inv
启用浮点无效操作的检测。 如果未同时指定 imprecise ,那么编译器将在每个浮点操作和函数调用后生成指令,以检查是否发生了无效操作异常。 如果发生浮点无效操作,那么将在 FPSCR 中设置无效操作异常状态标志。
NANQ
生成代码以检测每个浮点运算 (包括赋值) 前后的 "不是数字停顿" (NaNQ) 和 "不是数字信号" (NaNS) 异常,并在每次调用函数后返回浮点结果以捕获 (如果值为 NaN)。 无论是否指定了 enable 子选项,都将生成捕获代码。
溢出ov
允许检测浮点溢出。如果未同时指定 imprecise ,那么编译器将在每次浮点操作和函数调用后生成指令,以检查是否发生了溢出异常。 如果发生浮点溢出,那么将在 FPSCR 中设置溢出异常状态标志。
underflowund
支持检测浮点下流。 如果未同时指定 imprecise ,那么编译器将在每个浮点运算和函数调用后生成指令,以检查是否发生了下流异常。 如果发生浮点下流,那么会在 FPSCR 中设置下流异常状态标志。
零除
支持检测浮点除数为零。 如果未同时指定 imprecise ,那么编译器将在每个浮点运算和函数调用后生成指令,以检查是否发生了除零异常。 如果发生浮点除零,那么将在 FPSCR 中设置除零异常状态标志。

使用量

硬件将检测到异常,但不会启用陷阱。

建议您在使用 -qflttrap编译 main 程序时使用 enable 子选项。 这将确保编译器将生成代码以自动启用浮点异常捕获,而无需在代码中包含对相应浮点异常库函数的调用。

如果你多次指定 -qflttrap,无论是否带有子选项,都将忽略不带子选项的 -qflttrap

在与 IPA 链接期间,会识别 -qflttrap 选项。 在链接步骤指定选项会覆盖编译时设置。

如果您的程序包含信号 NaNs, ,则应使用 -qfloat=nans 选项和 -qflttrap 来捕获任何异常。

-qflttrap 选项与优化选项一起指定时,编译器将显示以下示例中所说明的行为:
  • 使用 -O2:
    • 1/0 生成 div0 异常,其结果为无穷大
    • 0/0 生成无效操作
  • 使用 -O3 或更高版本:
    • 1/0 生成 div0 异常,其结果为无穷大
    • 0/0 返回零乘以上一个除法的结果。
如果使用 -qflttrap=inv:en 来编译包含 IEEE 无效 SQRT 操作的程序,并且指定了未实现 sqrt 指令集的 -qarch 目标,那么运行该程序时不会出现期望的 SIGTRAP 信号。 可以通过在运行程序之前指定以下命令来解决此问题:
export SQRT_EXCEPTION=3.1
注: 由于所执行的变换以及对某些向量指令的异常处理支持,使用 -qsimd=auto 可能会更改捕获异常的位置,甚至会导致编译器无法捕获异常。

预定义的宏

无。

示例

#include <stdio.h>

int main()
{
  float x, y, z;
  x = 5.0;
  y = 0.0;
  z = x / y;
  printf("%f", z);
}      
当你使用以下命令编译此程序时,程序会在执行除法时停止。
xlc -qflttrap=zerodivide:enable divide_by_zero.c

zerodivide 子选项标识要防范的异常类型。 发生异常时, enable 子选项会导致生成 SIGTRAP 信号。

相关信息