我可以期望用户空间程序中的任何"数据"指针与地址0和0xffffffff ...保持安全距离,这样我可以安全地向指针添加一个小偏移而不检查溢出吗?当p是指向常量字符缓冲区或动态分配字符串的char指针(在现代> = 32位操作系统上)时,我可以安全地假设p + n不会溢出的最大正n是多少?
为了避免混淆:我在谈论溢出检查,而不是边界检查.例如:如果你有一个带有m个字符的字符串开头的指针p,并且你想要访问正偏移量i的字符,那么你需要检查i
更新:好的,如果i> m,p + i无效标准C,无论p + i是否实际被解除引用或是否溢出.然而,我真正感兴趣的问题是,是否存在一个小的n,p + n 在实践中不会溢出.回答这个问题显然需要一些关于现代操作系统如何组织地址空间的知识.
Update2:听说任何一个特定的平台已经非常有趣了,即使它不具有推广性.优选地,不是一些模糊的嵌入式嵌入式.x86或基于Power的32位Win,Linux和Mac将是最有趣的.
您可以安全地添加到指针(然后取消引用它)的唯一偏移量是将指针放在您正在使用的内存块中的偏移量.该块必须已使用new或malloc分配,或者存在于堆栈中.
无论哪种方式,都保证存在内存(并且存储器末尾的内存是合理的地址),否则你会遇到新的异常,来自malloc的NULL指针或未定义的行为,如果你试图错误在堆栈上分配.在任何情况下你都不必检查溢出.