You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:20:58