的小阵列为什么当我这样做:STRCPY一个更大的串字符
char teststrcpy[5];
strcpy(teststrcpy,"thisisahugestring");
我得到的运行时间这条消息:
Abort trap: 6
它不应该只是覆盖了在teststrcpy的记忆吧?如果不是,Abort陷阱的含义是什么?
我用下MAC OSX
GCC编译器作为一个说明,并在回答一些意见,我做这个周边Ç打,我不会去尝试这样做生产。你不担心民谣! :)
感谢
的小阵列为什么当我这样做:STRCPY一个更大的串字符
char teststrcpy[5];
strcpy(teststrcpy,"thisisahugestring");
我得到的运行时间这条消息:
Abort trap: 6
它不应该只是覆盖了在teststrcpy的记忆吧?如果不是,Abort陷阱的含义是什么?
我用下MAC OSX
GCC编译器作为一个说明,并在回答一些意见,我做这个周边Ç打,我不会去尝试这样做生产。你不担心民谣! :)
感谢
我没有一个,但我读过Mac OS以不同方式处理溢出,它不会允许您覆盖内存incertian实例。 strcpy()
是其中之一
在Linux机器上,此代码成功覆盖下一个堆栈,但是由于stack canary而导致在mac os(中止陷阱)上阻止。
你也许能够得到解决,与海湾合作委员会选项-fno-stack-protector
好吧,既然你看到从__strcpy_chk
中止,这将意味着它的具体检查的strcpy(也可能是朋友)。所以,从理论上讲,你可以做以下*:
char teststrcpy[5];
gets(teststrcpy);
然后输入很长的字符串,它应该表现baddly如你所愿。
*我只是建议gets
在这个特定的情况下,试图绕过操作系统的保护机制。在其他情况下,我会建议任何人使用该代码。 gets
是不是安全。
将问题的代码构建到'main'例程中,在调试器中执行它,并显示结果堆栈显示'__strcpy_chk'调用的中止。使用“-fno-stack-protector”不会改变这一点。 (苹果铛4.0,默认选项,OSX 10.8.2。) –
@EricPostpischil - 很高兴看到它确实是Mac OS ......你可以尝试编辑过的建议,看看它是否适合你?我怀疑“操作系统保护”不适用于损坏/不安全的“gets”功能。 – Mike
用'gets',会得到分段错误;它似乎失败了,因为覆盖缓冲区会改变重要数据,而不是因为它被检查机制所捕获。但是,编译期间会显示警告:“警告:此程序使用gets(),这是不安全的。” –
它不应该只是简单地覆盖的是在
teststrcpy
内存的吧?
不一定,它是未定义的行为,写入分配的内存之外。在你的情况,一些检测出界外写入和终止程序。
在C没有人谁告诉你,“缓冲区太小”如果你坚持复制的字符太多的缓冲区太小,你将进入不确定的行为TERRORITY
如果你想覆盖什么teststrcpy 5日焦炭之后,你是一个可怕的人。您可以大小为4的字符串复制到teststrcpy(第五焦炭SHOLULD可以为NULL保留)。
最有可能你的编译器是使用缓冲区溢出保护金丝雀,因此,提高此异常时存在溢出,防止从缓冲区外写入。
请参阅http://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries
您在使用什么IDE/OS? – Mike
在写入更多变量时,你期望它做什么,而不是有空间? – wallyk
中止陷阱意味着操作系统检测到一些错误,并且它终止了您的进程。最有可能的是,“只是重写”重写了一些它不应该被覆盖的东西。 – 2013-01-22 19:30:46