到这里快一个月了,刚刚过去的一个星期正式开始写了一点程序,也算正式走上了工作岗位了,等生活走上正轨,也有时间正式写写blog了!呵呵。到时候可以把自己的情况搬上来了~
该文章发布于2006-7月-29 5:28 下午,归类为C/C++。你可以通过RSS 2.0 來追踪该文章的留言。 你可以选择留言,或者从你的网站引用
显然的事情,以前学C语言也做过这种实验,当时并不知道栈分配与堆分配的区别,对于时对时错的运行结果莫名其妙。内存和硬盘一样,都是已收回的空间在覆盖前不会改变值。而且C++对越界访问的指针也不会进行有效性检查,因此可能出现令人头疼的程序错误但运行正确的怪事……
关键是输出函数覆盖的值是有规律的,这一点非常奇怪。而且printf输出之后,该值恒为-1。这个指针不能算越界吧~~,已回收的空间的访问~
输出函数在栈上分配空间时会覆盖它的值,但输出函数又不是个随机数生成器,覆盖的值当然会有规律,真想弄清楚的话看看汇编代码就知道了。
程序执行之前,操作系统会给程序分配一个栈空间,这个栈空间程序可以随便使用,管它指针指向什么位置都能读。所以在运行时,程序并没有“回收”什么空间,只不过编译器生成的代码认为某个字节是可以使用的,会覆盖它而已。
即使程序去访问不属于自己的空间,操作系统也未必会阻止它。不然哪来那么多缓冲区溢出……
呵呵,依赖于操作顺序的东西,其结果太不好把握了。“输出函数又不是个随机数生成器,覆盖的值当然会有规律”你说得太大了,我只说printf,如果用流输出所覆盖的值就是随机的。而对随机值,往往容易注意得到。而printf的-1,很容易迷惑人。如果恰好覆盖之前值就是-1,那么很容易让这个bug生存下去
名称 (必须填写)
电子邮件 (不会公开) (必须填写)
网站
显然的事情,以前学C语言也做过这种实验,当时并不知道栈分配与堆分配的区别,对于时对时错的运行结果莫名其妙。
内存和硬盘一样,都是已收回的空间在覆盖前不会改变值。而且C++对越界访问的指针也不会进行有效性检查,因此可能出现令人头疼的程序错误但运行正确的怪事……
关键是输出函数覆盖的值是有规律的,这一点非常奇怪。而且printf输出之后,该值恒为-1。这个指针不能算越界吧~~,已回收的空间的访问~
输出函数在栈上分配空间时会覆盖它的值,但输出函数又不是个随机数生成器,覆盖的值当然会有规律,真想弄清楚的话看看汇编代码就知道了。
程序执行之前,操作系统会给程序分配一个栈空间,这个栈空间程序可以随便使用,管它指针指向什么位置都能读。所以在运行时,程序并没有“回收”什么空间,只不过编译器生成的代码认为某个字节是可以使用的,会覆盖它而已。
即使程序去访问不属于自己的空间,操作系统也未必会阻止它。不然哪来那么多缓冲区溢出……
呵呵,依赖于操作顺序的东西,其结果太不好把握了。“输出函数又不是个随机数生成器,覆盖的值当然会有规律”你说得太大了,我只说printf,如果用流输出所覆盖的值就是随机的。而对随机值,往往容易注意得到。而printf的-1,很容易迷惑人。如果恰好覆盖之前值就是-1,那么很容易让这个bug生存下去