我是否可以期望用户空间程序中的任何“数据”指针与地址 0 和 0xffffffff... 保持安全距离,以便我可以安全地为指针添加一个小偏移量而不检查溢出?当 p 是指向常量字符缓冲区或动态分配字符串的 char 指针(在现代 >= 32 位操作系统上)时,我可以安全地假设 p + n 不会溢出的最大正 n 是多少?
为避免混淆:我说的是溢出检查,而不是边界检查。例如:如果您有一个指针 p 指向具有 m 个字符的字符串的开头,并且您想在正偏移量 i 处访问该字符,那么您需要检查 i < m 或者您可以间接检查 p + i < p + 米。但是,在后一种情况下,您还必须确保 p + i 不会溢出,即您必须确保 p + i >= p。
更新:好的,如果 i > m,p + i 不是有效的标准 C,无论 p + i 是否实际取消引用或是否溢出。但是,我真正感兴趣的问题是是否存在一个小的 n ,而 p + n在实践中不会溢出。回答这个问题显然需要一些关于现代操作系统如何组织地址空间的知识。
更新 2:听到任何一个特定平台已经很有趣了,即使它不是通用的。最好不是一些晦涩难懂的嵌入式。x86 或基于 Power 的 32 位 Win、Linux 和 Mac 将是最有趣的。