memcpy越界拷贝,会导致崩溃,但具体原因是什么?

topcij123 2012-02-07 06:50:58
void main()
{
char* p = NULL;
p = (char*)malloc(10);
char* ps = (char*)malloc(10000);
memcpy(p,ps,1000);

free(p);

}

我这段越界拷贝,会导致崩溃,我的疑问是:p 和 ps 分配空间,无论你往里面拷贝什么,都是2进制的数值,free释放的时候它自己知道分配了多大空间,也会自己释放多少的空间,按道理是不会有问题的,但为什么在VS2005下 却会崩溃,其他编译器我没试过,按道理应该也有崩溃吧,, 求原因.
...全文
4367 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
northcan 2012-02-13
  • 打赏
  • 举报
回复
“内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址
是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由
于读到的数据是随机的,它会产生不可预料的后果。另外一种是写越界,又叫缓冲区溢出。
它会产生不可预料的后果,比如把程序返回地址改掉了,使函数返回时跳到未知内存,导致崩溃。”
vilnies 2012-02-13
  • 打赏
  • 举报
回复
越界就好比踏进了地雷区。很可能生还,也很可能碰到各种雷!!
cpuzer 2012-02-13
  • 打赏
  • 举报
回复
made,编译都通不过
ziwei55 2012-02-10
  • 打赏
  • 举报
回复
概念都还没搞清,也写这个程序
Jokul_Lee 2012-02-10
  • 打赏
  • 举报
回复
内存分配和管理,实际上不是你再操作,也就是说,你申请了10个byte的内存,在memcpy的时候却操作了你没申请的那部分内存,这部分内存中可能存在其他有用的数据,你把这部分内存中的值改变了,这部分的数据丢失了,所以引起的错误可以说是多种多样的,未知的,出什么错误都是有可能的。
sl51314240 2012-02-10
  • 打赏
  • 举报
回复
Windows内存是一页面为单位的,页面是有保护属性的,如果该页面的保护属性没有写权限,那么你的memcpy就是违规访问,被Windows强行干掉,还弹出一个大大警告框来鄙视你
Enter空格 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 redleaves 的回复:]

引用 12 楼 mymixing 的回复:
第2条,CPU如果执行了非法的代码引发的应该是死机吧。
写坏了栈并不是执行了非法代码,而是正确的代码使用了栈中错误的数据,引发的读写错误。
不使用特殊手段是无法改写代码段的代码的。
非法代码会引起CPU非法指令异常...然后交由OS处理.如果CPU执行非法代码就死机,那CPU也太脆弱了.
写坏栈不光会写坏栈中的数据,还可能会写坏函数返回地址,……
[/Quote]

呵呵,我说的cpu执行了非法代码死机的意思是,cpu 真的己经使用了IP所指向的
根本就不是指今的数据,操作系统有没有能力为这个错误拋出异常我不很明确
但是去除了操作系统,cpu 一但执行了非法代码(非法代码指的是根本就没有的指令),则肯定死机。
至于写坏了栈,那就是使用了栈中错误的数据引发的读写异常。
你说的写坏了反回地址就是使用了错误的数据而己,并不是错误的代码
代码和数据是两回事

majia2011 2012-02-09
  • 打赏
  • 举报
回复
free的时候会做完整性检查
Enter空格 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 redleaves 的回复:]

引用 18 楼 mymixing 的回复:但是去除了操作系统,cpu 一但执行了非法代码(非法代码指的是根本就没有的指令),则肯定死机。先要搞清楚死机是个什么概念.否则,这将是一个扯皮的点...
在OS层面,死机就是指OS进入了不可恢复的状态,无法响应和正常工作了.
同理,CPU死机应该是指CPU被挂起,不再执行指令和响应硬件消息了.

而CPU执行了非法的指令代码以后,并不会死机,而是……
[/Quote]
谢谢哈,关于死机是我武断了,弄死过一次就这样认为了。。
Enter空格 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 redleaves 的回复:]

引用 18 楼 mymixing 的回复:但是去除了操作系统,cpu 一但执行了非法代码(非法代码指的是根本就没有的指令),则肯定死机。先要搞清楚死机是个什么概念.否则,这将是一个扯皮的点...
在OS层面,死机就是指OS进入了不可恢复的状态,无法响应和正常工作了.
同理,CPU死机应该是指CPU被挂起,不再执行指令和响应硬件消息了.

而CPU执行了非法的指令代码以后,并不会死机,而是……
[/Quote]
谢谢哈,关于死机是我武断了,弄死过一次就这样认为了。。
qwer_boo 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhao4zhong1 的回复:]

《深入解析Windows操作系统-Windows Internals》内存管理
[/Quote]应该是位大牛
redleaves 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 mymixing 的回复:]但是去除了操作系统,cpu 一但执行了非法代码(非法代码指的是根本就没有的指令),则肯定死机。[/Quote]先要搞清楚死机是个什么概念.否则,这将是一个扯皮的点...
在OS层面,死机就是指OS进入了不可恢复的状态,无法响应和正常工作了.
同理,CPU死机应该是指CPU被挂起,不再执行指令和响应硬件消息了.

而CPU执行了非法的指令代码以后,并不会死机,而是转向6号中断,返回一个fault类型的异常.指出错误的相关信息.此时,CPU还在正常工作,如果中断处理适当,并不会引起CPU死机.
FrankHB1989 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mymixing 的回复:]

引用 11 楼 redleaves 的回复:

越界操作引起的崩溃根源一般是下面两种情况
1.权限问题 -- 访问了没有相应访问权限的地址.一般读越界引起崩溃都是这种. 多数写越界也会直接或间接引起这种问题.
2.代码执行出错 -- 执行了非法的代码或是由数据错误引起的代码执行异常. 这种错误多由写越界引起.比如写坏了栈导致执行的非法代码,读取错误数据. 写坏了堆引起堆管理代码执行异常等……
[/Quote]
SIGILL≠死机。
redleaves 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mymixing 的回复:]
第2条,CPU如果执行了非法的代码引发的应该是死机吧。
写坏了栈并不是执行了非法代码,而是正确的代码使用了栈中错误的数据,引发的读写错误。
不使用特殊手段是无法改写代码段的代码的。[/Quote]
非法代码会引起CPU非法指令异常...然后交由OS处理.如果CPU执行非法代码就死机,那CPU也太脆弱了.
写坏栈不光会写坏栈中的数据,还可能会写坏函数返回地址,从而执行到未知地址上的代码,这就是所谓的缓冲区溢出漏洞.栈数据错误引发的读写错误,在第1项访问违例中已经包含了.第2条着重说的是代码执行的"错误"使CPU抛出的非访问违例类的异常,比如除0异常,非法指令异常等等.
nightkids_008 2012-02-08
  • 打赏
  • 举报
回复
2楼 +1 ,你访问的虚拟内存必须是可映射到物理内存的。
程序员小迷 2012-02-08
  • 打赏
  • 举报
回复
楼主的代码很奇怪啊;
你向地址p里拷贝了1000个字节,拷贝源都没初始化,p地址对应的内存才10字节,
程序执行就有很大问题,为什么不崩溃?
灼眼的超哥 2012-02-08
  • 打赏
  • 举报
回复
数据越界都是由于你写的数据量大于该变量的容量导致的,装不了就写到别的空间去了,最后就报错。
我通常是free出错,有时是malloc一个指针报错,分配一个内存都报段错误。。。
Enter空格 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 redleaves 的回复:]

越界操作引起的崩溃根源一般是下面两种情况
1.权限问题 -- 访问了没有相应访问权限的地址.一般读越界引起崩溃都是这种. 多数写越界也会直接或间接引起这种问题.
2.代码执行出错 -- 执行了非法的代码或是由数据错误引起的代码执行异常. 这种错误多由写越界引起.比如写坏了栈导致执行的非法代码,读取错误数据. 写坏了堆引起堆管理代码执行异常等等.
[/Quote]

第2条,CPU如果执行了非法的代码引发的应该是死机吧。
写坏了栈并不是执行了非法代码,而是正确的代码使用了栈中错误的数据,引发的读写错误。
不使用特殊手段是无法改写代码段的代码的。
redleaves 2012-02-08
  • 打赏
  • 举报
回复
越界操作引起的崩溃根源一般是下面两种情况
1.权限问题 -- 访问了没有相应访问权限的地址.一般读越界引起崩溃都是这种. 多数写越界也会直接或间接引起这种问题.
2.代码执行出错 -- 执行了非法的代码或是由数据错误引起的代码执行异常. 这种错误多由写越界引起.比如写坏了栈导致执行的非法代码,读取错误数据. 写坏了堆引起堆管理代码执行异常等等.
cobra_chen 2012-02-08
  • 打赏
  • 举报
回复
如果可以这样,估计整个内存就乱了。
那样我这个程序就可以无条件修改其他内存的地址了。
系统的设计者肯定不会犯这样的错误的。

顺便提醒一下,申请内存之后要检查是否正确的获得了地址。
加载更多回复(9)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧