因此,我正在为程序进行单元测试,但是在某些情况下,我知道它应该崩溃,但我似乎无法使其崩溃,这是我遇到的一个例子。
#include <stdio.h>
int main(void)
{
char buf[2] = { 0 };
int i = -1;
printf("%c", buf[i]);
return (0);
}
根据我的理解,它应该以某种熵崩溃,但是似乎要做的只是从指针在内存中的位置读取。还是应该认为这种行为是正常现象,无论我们进行哪种测试,都无法崩溃?
答案 0 :(得分:1)
此行为应为未定义。这意味着它可能崩溃,或者它可以打印垃圾,或者它什么都不打印,因为允许编译器假定未定义的行为不会发生,并且不生成任何导致它的代码...或者它可以杀死您(从字面上看) ),如果它进入了安全关键型应用程序的生产代码中。
如果您真的想对其进行测试,则需要依赖于您的编译器行为的知识以及特定平台上实现定义的技巧,例如,在具有MMU支持的Linux上,将buf
与内存页面的开始并将前一个内存页面标记为mprotect(PROT_NONE)
-那么当您尝试访问它时会得到SIGSEGV
。