__assert1, __assert2
用途
生成陷阱指令。
原型
int __assert1 (int a , int b , int c);
void __assert2 (int a);
使用量
__assert1 函数使用 c指定的条件来比较参数 a 和 b 。 参数 c 必须是介于 1 到 31 (含) 之间的字面值或编译时常量。 请参阅下表以了解比较条件与 c的值之间的映射关系。
编译时比较
如果可以在编译时对比较进行求值,那么编译器将在编译时执行比较并具有以下行为:
- 如果比较结果为 true ,将生成无条件陷阱指令,发生陷阱,并生成 SIGTRAP 信号。 如果 SIGTRAP 信号处理程序存在,那么将执行该信号处理程序。 如果 SIGTRAP 信号处理程序不存在,那么程序将以 SIGTRAP 退出代码终止。
- 如果比较结果为 false ,那么不会生成陷阱指令,不会发生陷阱,也不会生成 SIGTRAP 信号。
运行时比较
如果无法在编译时对比较进行求值,那么编译器将生成条件陷阱指令以在运行时检查比较,并具有以下行为:
- 如果比较结果为 true ,那么将发生陷阱,并生成 SIGTRAP 信号。 如果 SIGTRAP 信号处理程序存在,那么将执行该信号处理程序。 如果 SIGTRAP 信号处理程序不存在,那么程序将以 SIGTRAP 退出代码终止。
- 如果比较结果为 false ,那么不会发生陷阱,并且不会生成 SIGTRAP 信号。
在优化期间,编译器可能会除去陷阱指令。 要避免此问题,请使用 __assert1 的结果作为__assert2 函数的输入,以在这两个函数之间创建依赖关系。 __assert2 函数充当编译时陷阱锚点,可防止在编译器优化期间废弃针对 __assert1 生成的陷阱或陷阱立即指令,除非无法访问该指令。