为何macOS arm64下malloc分配的内存全为0?是否与ASLR有关?
macOS arm64平台下malloc分配内存全为0的原因分析
问题描述
据了解,malloc本身不会初始化所分配的内存,但在macOS arm64平台上,通过代码测试和lldb调试发现,malloc分配的内存值全部为0。请问该现象产生的原因是什么?这是否与ASLR有关?
测试代码
#include <stdio.h> #include <stdlib.h> int main(int argc, const char * argv[]) { int *ptr = malloc(sizeof(int) * 100); for (int idx = 0; idx < 100; idx++) { printf("%d\n", ptr[idx]); // 0 } free(ptr); return 0; }
调试输出
(lldb) memory read 0x126004f70 --size 4 --count 100 -f d 0x126004f70: 0 0x126004f74: 0 0x126004f78: 0 0x126004f7c: 0 0x126004f80: 0 0x126004f84: 0 0x126004f88: 0 0x126004f8c: 0 0x126004f90: 0 0x126004f94: 0 0x126004f98: 0 0x126004f9c: 0 ...
问题解答
内存全为0的原因
C标准确实没有要求malloc初始化内存,但macOS arm64平台的malloc实现(属于libsystem_malloc.dylib)做了额外的安全优化:
- 当
malloc从操作系统通过mmap申请全新内存页时,内核本身会自动清零这些页面,避免泄露其他进程或内核的敏感数据; - 即便是从
malloc的内存池中复用已释放的内存块,该实现也会主动将其清零,以此降低程序因读取未初始化内存而出现的不可预知行为风险,同时提升安全性。
这是苹果针对自家平台的定制化设计,不能当作跨平台的通用行为依赖——在其他系统(比如Linux)或旧版macOS的某些场景下,malloc仍可能返回带有随机垃圾数据的内存。
与ASLR的关系
该现象和ASLR(地址空间布局随机化)完全无关。ASLR的作用仅在于随机化进程中堆、栈、代码段等内存区域的起始地址,以此防范攻击者利用固定内存地址进行漏洞利用,它不会对内存的初始值产生任何影响。
内容的提问来源于stack exchange,提问作者Jinwoo Kim
相关产品推荐
相关产品推荐

