【发布时间】:2017-02-23 16:59:33
【问题描述】:
我在 Linux 环境中用 C 语言编程,并且 我很困惑为什么这段代码中没有出现分段错误:
int main(){
char buffer[4];
char tmp="qqqqqqqqqqqqqqqqqqqqqqqq";
char *r;
r=strcpy(buffer,tmp);
return 0;}
我使用的变量 tmp 比缓冲区长,尽管它我可以正确地标记缓冲区变量而不会出现任何错误。
此外,我不明白为什么在这种情况下:
int main(){
static char buffer[4];
int i=0;
while(i<5){
(*(buffer+i)='a');
i++;}
return 0;}
只有当我没有声明缓冲区为静态时才会发生分段错误。
提前谢谢你。
【问题讨论】:
-
UB 并不意味着您会遇到 SegFault,请参阅 this answer
-
char tmp="qqqqqqqqqqqqqqqqqqqqqqqq";错误:您将const char *分配给char,不要忽略编译器警告 -
while(i<5){也是错误的,buffer的类型是char[4],这意味着有效的索引是 0 到 3。 -
如果缓冲区溢出,不能保证会自动生成段错误;这就是缓冲区溢出攻击起作用的原因:-(。答案在平台上有所不同,但基本上变量的类型(静态或否,函数本地,malloc()ed)会改变它在内存中填充的位置,这可能会更宽松或更严格,具体取决于硬件辅助(例如 NC)、堆栈粉碎保护和其他因素。简而言之:不要指望内存保护可以让您免于各种形式的愚蠢:-/
-
第一个例子还能编译吗?调用
strcpy(buffer, tmp)应该会产生编译器错误,因为tmp被声明为char而不是char*。
标签: c