首页 > 解决方案 > 我的单元测试无法使错误的逻辑崩溃

问题描述

所以我正在为我的程序进行单元测试,但有一种情况我知道它应该崩溃但我似乎无法让它这样做,这是我的一个例子。

#include <stdio.h>

int main(void)
{
    char    buf[2] = { 0 };
    int     i = -1;

    printf("%c", buf[i]);
    return (0);
}

据我了解,它应该在某种熵中崩溃,但它似乎所做的只是从指针在内存中的位置读取。或者这种行为应该是正常的,无论我们运行什么样的测试,它都不会崩溃?

标签: c

解决方案


这种行为应该是未定义的。这意味着它可能会崩溃,或者它可以打印垃圾,或者它不能打印任何内容,因为允许编译器假设未定义的行为不会发生并且不生成任何导致它的代码......或者它可能会杀死你(字面意思) 如果它找到了进入安全关键应用程序的生产代码的方式。

如果你真的想测试它,你需要依赖于你的编译器行为的知识和你特定平台的实现定义的技巧,例如,在支持 MMU 的 Linux 上,将 对齐buf到内存页面的开头并标记前面的内存页面为mprotect(PROT_NONE)- 然后您将SIGSEGV在尝试访问它时得到。


推荐阅读