2013-01-22 66 views
4

的小阵列为什么当我这样做:STRCPY一个更大的串字符

char teststrcpy[5]; 

strcpy(teststrcpy,"thisisahugestring"); 

我得到的运行时间这条消息:

Abort trap: 6 

它不应该只是覆盖了在teststrcpy的记忆吧?如果不是,Abort陷阱的含义是什么?

我用下MAC OSX

GCC编译器作为一个说明,并在回答一些意见,我做这个周边Ç打,我不会去尝试这样做生产。你不担心民谣! :)

感谢

+0

您在使用什么IDE/OS? – Mike

+0

在写入更多变量时,你期望它做什么,而不是有空间? – wallyk

+0

中止陷阱意味着操作系统检测到一些错误,并且它终止了您的进程。最有可能的是,“只是重写”重写了一些它不应该被覆盖的东西。 – 2013-01-22 19:30:46

回答

1

我没有一个,但我读过Mac OS以不同方式处理溢出,它不会允许您覆盖内存incertian实例。 strcpy()是其中之一

在Linux机器上,此代码成功覆盖下一个堆栈,但是由于stack canary而导致在mac os(中止陷阱)上阻止。

你也许能够得到解决,与海湾合作委员会选项-fno-stack-protector


好吧,既然你看到从__strcpy_chk中止,这将意味着它的具体检查的strcpy(也可能是朋友)。所以,从理论上讲,你可以做以下*:

char teststrcpy[5]; 
gets(teststrcpy); 

然后输入很长的字符串,它应该表现baddly如你所愿。

*我只是建议gets在这个特定的情况下,试图绕过操作系统的保护机制。在其他情况下,我会建议任何人使用该代码。 gets是不是安全。

+0

将问题的代码构建到'main'例程中,在调试器中执行它,并显示结果堆栈显示'__strcpy_chk'调用的中止。使用“-fno-stack-protector”不会改变这一点。 (苹果铛4.0,默认选项,OSX 10.8.2。) –

+0

@EricPostpischil - 很高兴看到它确实是Mac OS ......你可以尝试编辑过的建议,看看它是否适合你?我怀疑“操作系统保护”不适用于损坏/不安全的“gets”功能。 – Mike

+0

用'gets',会得到分段错误;它似乎失败了,因为覆盖缓冲区会改变重要数据,而不是因为它被检查机制所捕获。但是,编译期间会显示警告:“警告:此程序使用gets(),这是不安全的。” –

2

它不应该只是简单地覆盖的是在teststrcpy内存的吧?

不一定,它是未定义的行为,写入分配的内存之外。在你的情况,一些检测出界外写入和终止程序。

2

在C没有人谁告诉你,“缓冲区太小”如果你坚持复制的字符太多的缓冲区太小,你将进入不确定的行为TERRORITY

0

如果你想覆盖什么teststrcpy 5日焦炭之后,你是一个可怕的人。您可以大小为4的字符串复制到teststrcpy(第五焦炭SHOLULD可以为NULL保留)。

相关问题