第一个问题是不是问错了?分配的40字节,当然允许访问20字节啊。你要问的是不是访问40字节以上?
OS内存的分配和释放实际是按page操作的,程序的CRT函数malloc()所分配的heap block如果处于某个page的中间,或者后面还有一个能读取的page,那么可以读取超过40字节的内容而不崩溃,但已经属于越界了。MSVC调试器里面看一下对应的内存就知道了,debug -> windows -> memory。
如果malloc()所分配的heap block如果正好处于某个page的尾部,并且后面没有任何可以读取的page了,那么你读取超过40个字节就立马会崩掉。这就是检查内存越界的那些工具的原理,在前面/后面设立一个guard page,设置为不允许读写。
_msize()是MSVC特有的,返回值反映的是MSVC的heap的实现,通常不需要关心这个,也不需要调用这个函数。
如果对malloc()的内部实现好奇,可以读它的源代码。MSVC和ntdll的heap实现有多个版本,一般只有写堆溢出利用代码的才关心。
【 在 sqsl 的大作中提到: 】
: 如下一段程序:
:
: #include <stdlib.h>
: ...................
--
FROM 221.218.160.*