为什么当 strcpy() 导致缓冲区溢出时没有分段错误?

Why no segmentation fault when strcpy() causes an buffer overflow?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main() {
    char *a = "aaaaaaaaaaaaaaaa";
    char b[1];
    strcpy(b, a);
    printf("%s\n", b);
}

当运行时,它打印:

aaaaaaaaaaaaaaaa

如果我让*a超长,例如*a="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",那么它会导致段错误。

为什么第一种情况没有溢出?

当您的程序试图访问不属于您程序的虚拟地址的内存时,会发生分段错误space;如果您只是在原始复制目的地之后覆盖一些内容,就不会发生这种情况。

有buffer overflow,并不代表一定会导致segmentation fault。这是未定义的行为 - 可能存在段错误。这取决于内存中变量之后的 "placed" 是什么。

似乎可以工作,或者就此而言,没有崩溃,是未定义行为的一种有效形式。 当您的程序有 UB 时,任何事情 都可能发生。这就是为什么它非常不受欢迎。