如何使用 cmake 来测试预期会因异常而失败的进程?(例如,由于 clang 的地址清理导致的失败)

Tom*_*don 4 automated-tests cmake clang address-sanitizer

我有一些测试来测试 clang 的地址清理器捕获特定错误。(我想确保我对它可以捕获的错误类型的理解是正确的,并且未来的版本会继续捕获我期望它们捕获的错误类型。)这意味着我有几个测试失败了OTHER_FAULT,这似乎是 clang 运行时报告错误的固定方式。

我已经为这些测试设置了WILL_FAIL标志TRUE,但这似乎只是检查成功、无异常失败的返回值。如果进程因异常终止,cmake 仍将其归类为失败。

我还尝试使用PASS_REGULAR_EXPRESSION来观察发生此错误时打印出的区分消息,但同样,如果测试以异常终止,cmake 似乎将测试归类为失败。

我能做些什么来解决这个问题吗?

(特定于 clang 的答案也是一种选择!-但我怀疑这将是我最后一次需要测试这样的东西,所以如果可能的话,我更愿意知道如何使用 cmake 进行测试)

Tsy*_*rev 5

CTest 只为测试程序的结果提供基本的、常用的解释器。为了实现其他解释器,您可以编写简单的程序/脚本,它包装测试并根据需要解释其结果。例如 C 程序(适用于 Linux):

test_that_crash.c :

#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>

int main(int argc, char** argv)
{
    pid_t pid = fork();
    if(pid == -1)
    {
        // fork fails
        return 1;
    }
    else if(pid)
    {
        // Parent - wait child and interpret its result
        int status = 0;
        wait(&status);
        if(WIFSIGNALED(status)) return 0; // Signal-terminated means success
        else return 1;
    }
    else
    {
        // Child - execute wrapped command
        execvp(argv[1], argv + 1);
        exit(1);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个程序可以在 CMake 中使用,如下所示:

CMakeLists.txt

# Compile our wrapper
add_executable(test_that_crash test_that_crash.c)
# Similar to add_test(name command), but test is assumed successfull only if it is crashed(signalled)
macro(add_test_crashed name command)
    # Use generic flow of add_test() command for automatically recognize our executable target
    add_test(NAME ${name} COMMAND test_that_crash ${command} ${ARGN})
endmacro(add_test_crashed)
# ...

# Add some test, which should crash
add_test_crashed(clang.crash.1 <clang-executable> <clang-args>)
Run Code Online (Sandbox Code Playgroud)