__assert1, __assert2

用途

生成陷阱指令。

原型

int __assert1 (int a , int b , int c);

void __assert2 (int a);

使用量

__assert1 函数使用 c指定的条件来比较参数 ab 。 参数 c 必须是介于 1 到 31 (含) 之间的字面值或编译时常量。 请参阅下表以了解比较条件与 c的值之间的映射关系。
表 1. c 指定的比较条件
比较条件
16 <
8 >
4 ==
2 <1
1 >1
备注信息:
  1. 在执行比较之前,会将 ab 的值转换为无符号整数。
  2. 可以对表中的值进行 OR 运算以获取更多比较条件; 例如,对于带符号整数, 24 表示 !=

编译时比较

如果可以在编译时对比较进行求值,那么编译器将在编译时执行比较并具有以下行为:
  • 如果比较结果为 true ,将生成无条件陷阱指令,发生陷阱,并生成 SIGTRAP 信号。 如果 SIGTRAP 信号处理程序存在,那么将执行该信号处理程序。 如果 SIGTRAP 信号处理程序不存在,那么程序将以 SIGTRAP 退出代码终止。
  • 如果比较结果为 false ,那么不会生成陷阱指令,不会发生陷阱,也不会生成 SIGTRAP 信号。

运行时比较

如果无法在编译时对比较进行求值,那么编译器将生成条件陷阱指令以在运行时检查比较,并具有以下行为:
  • 如果比较结果为 true ,那么将发生陷阱,并生成 SIGTRAP 信号。 如果 SIGTRAP 信号处理程序存在,那么将执行该信号处理程序。 如果 SIGTRAP 信号处理程序不存在,那么程序将以 SIGTRAP 退出代码终止。
  • 如果比较结果为 false ,那么不会发生陷阱,并且不会生成 SIGTRAP 信号。

在优化期间,编译器可能会除去陷阱指令。 要避免此问题,请使用 __assert1 的结果作为__assert2 函数的输入,以在这两个函数之间创建依赖关系。 __assert2 函数充当编译时陷阱锚点,可防止在编译器优化期间废弃针对 __assert1 生成的陷阱或陷阱立即指令,除非无法访问该指令。