我认为读取内存不应该造成任何问题,例如:
char *d="";
char *d2="test";
memcmp(d,d2,10);
memcmp()
能否失败?
char *d="";
char *d2="test";
memcmp(d,d2,10);
memcmp()
能否失败?
SEGV
错误。特别是读取地址0(在几乎所有体系结构上),以及读取内核内存空间(如果它甚至被映射),但通常情况下,读取逻辑内存时没有映射到可读物理内存。memcmp
,这是未定义行为。它可能会从堆栈或数据段读取垃圾,但你无法知道。例如,d
可能就在堆栈顶部,因此你可能会超出堆栈顶部进入未映射的内存(堆栈通常向下增长)。d
本身在哪里并不重要,因为memcmp()
从存储在d
中的地址中读取,这是危险的。 我们知道已将其设置为字符串文字,该文字永远不会在堆栈上出现-传统上它位于数据段中。 - Tony Delroyd
是一个指针(char *
),所以 d
本身不是只读的。由 d
指向的数据可能位于只读内存中,也可能位于可写区域中;您无法保证其位置或可写性,并且没有任何防止编译器将其(例如)放在堆栈顶部的措施。重点是超出它的读取是未定义的。 - abligh
d2
后面的下5个字节,它就可以完成比较,因此,如果内存保护是按页面大小排列的,并且页面足够大以容纳两个字符串文字,它就不会出现故障,如果程序中其他地方还有合法可读数据被打包在d2
后面的5个字节中,它也不会出现故障。 - Tony Delroy