如何测试自定义abort_routine()函数不会返回?(基于LLVM Lit)
如何测试
abort_routine()不返回的要求(基于LLVM Lit工具) 当然可以测试这个要求!结合Lit这类工具的特性,我们可以通过构造“不可能执行到的代码”来验证abort_routine()是否真的不会返回。下面是具体的实现思路和步骤:
核心测试逻辑
既然abort_routine()的要求是绝对不能返回,那只要在调用它之后写一段“如果执行到就代表测试失败”的代码,再通过Lit检查程序的执行结果就能验证:
- 如果
abort_routine()确实不返回,那后续代码永远不会被执行,程序会因内部的abort()触发异常终止(退出码非0或被信号杀死)。 - 如果
abort_routine()意外返回了,后续代码会执行,程序会以正常状态退出(比如退出码0),此时测试就会失败。
测试程序示例
先写一个简单的C测试代码(假设你的库已经提供了abort_routine()的声明):
#include <stdlib.h> // 引入目标库的函数声明 void abort_routine(void); int main(void) { abort_routine(); // 下面的代码是"测试失败标记":只要执行到这里,说明abort_routine()返回了 exit(0); // 正常退出,退出码为0 }
Lit测试用例编写
接下来编写Lit的.test文件(比如命名为abort_routine_no_return.test),利用Lit的not指令来判断程序是否异常终止:
# 编译测试程序,链接你的目标库 RUN: %clang %s -o %t -lyour_target_library # 运行程序,期望它**不能正常退出**(即退出码非0或被信号终止) RUN: not %t
测试逻辑说明
not %t是Lit的关键指令:它会检查程序%t的执行结果,如果程序以非零状态退出(比如abort()触发的SIGABRT信号),则测试通过;如果程序正常退出(执行了exit(0)),则测试失败。- 这个方式跨平台性较好,不需要依赖特定系统的信号退出码,只要
abort_routine()不返回,测试就能稳定通过。
可选的进阶验证(针对特定系统)
如果你需要更精确地验证是abort()导致的终止(而非其他异常),可以在Linux系统下检查退出码(abort()会触发SIGABRT信号,对应退出码为134,即128+6):
RUN: %clang %s -o %t -lyour_target_library RUN: %t > %t.out 2>&1 || true RUN: test $? -eq 134
不过这种方式依赖系统,跨平台场景下还是推荐前面的not %t方案。
不管abort_routine()内部实现怎么变更,只要它违反了“不得返回”的要求,这个测试就能立刻检测到问题,完美满足你的需求。
内容的提问来源于stack exchange,提问作者embedc
相关产品推荐
相关产品推荐

