现代操作系统上最低的内存地址

Cya*_*yan 3 c memory malloc memory-address

我最近被指向了我的一个C程序,如果内存块的起始地址足够低,我的一个测试会因为绕零而失败,导致崩溃.

起初我认为"这是一个讨厌的潜在错误",但是,我想知道:这种情况会发生吗?我从来没有见过这个.公平地说,这个程序已经在无数系统上运行了数百万次,到目前为止它从未发生过.

因此,我的问题是:调用malloc()可能返回的最低内存地址是多少?据我所知,我从未见过像0x00000032这样的地址.

我只对"现代"环境感兴趣,例如Linux,BSD和Windows.此代码不适用于C64或任何业余爱好/研究操作系统.

R..*_*R.. 8

首先,既然这就是你所要求的,我只会考虑现代系统.这意味着他们正在使用分页内存并在0处有一个错误页面来处理空指针解引用.

现在,我在任何真实系统上都知道的最小页面大小是4k(4096字节).这意味着你永远不会有有效地址低于0x1000; 任何较低的内容都将是包含零地址的页面的一部分,因此将排除具有空指针解引用错误.

在现实世界中,良好的系统实际上可以阻止你走低; 现代Linux甚至可以防止应用程序故意将页面映射到可配置的默认值(64k,我相信).这个想法是你想要从空指针(例如p[n],p恰好是一个空指针)的中等大偏移到故障(并且在Linux的情况下,如果它试图访问这些地址以避免它们希望内核空间中的代码出错kernel null-pointer-dereference bugs,可以导致特权提升漏洞).

话虽如此,在指针指向的数组范围之外执行指针运算是未定义的行为.即使地址没有换行,编译器也可能会做各种事情(无论是强化代码还是仅用于优化),其中未定义的行为可能导致程序中断.好的代码应该遵循它所写的语言规则,即不要调用未定义的行为,即使你期望UB是无害的.