为什么当 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 时,任何事情 都可能发生。这就是为什么它非常不受欢迎。
#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 时,任何事情 都可能发生。这就是为什么它非常不受欢迎。