将更大的字符串strcpy到更小的char数组

时间:2013-01-22 19:24:50

标签: c

为什么我这样做:

char teststrcpy[5];

strcpy(teststrcpy,"thisisahugestring");

我在运行时收到此消息:

Abort trap: 6

它不应该只是覆盖 teststrcpy 的内存权限吗?如果没有,Abort陷阱意味着什么?

我在MAC OSX下使用GCC编译器

作为一个注释,并回答一些评论,我这样做是为了玩C,我不会尝试在生产中这样做。你不担心民俗! :)

由于

5 个答案:

答案 0 :(得分:2)

  

它不应该只覆盖teststrcpy内存右侧的内容吗?

不一定,在分配的内存之外写入是未定义的行为。在你的情况下,某些东西检测到越界写入并中止了程序。

答案 1 :(得分:2)

在C中没有人告诉你“缓冲区太小”如果你坚持将太多的字符复制到缓冲区太小你会进入未定义的行为恐怖

答案 2 :(得分:1)

我没有自己的,但我读过Mac OS对待溢出的方式不同,它不允许你覆盖内存的incertian实例。 strcpy()是其中之一

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

您可以使用gcc选项-fno-stack-protector

来解决这个问题

好的,因为你看到__strcpy_chk的中止意味着它专门检查strcpy(可能是朋友)。所以理论上你可以做以下*:

char teststrcpy[5];
gets(teststrcpy);

然后输入你真正长的字符串,它应该表现得很糟糕。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

很可能你的编译器正在使用canary进行缓冲区溢出保护,因此,当出现溢出时会引发此异常,从而阻止你在缓冲区外写字。

请参阅http://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries