【发布时间】:2020-05-11 21:51:23
【问题描述】:
出于调试目的,我希望malloc 在每次执行程序时返回相同的地址,但在 MSVC 中并非如此。
例如:
#include <stdlib.h>
#include <stdio.h>
int main() {
int test = 5;
printf("Stack: %p\n", &test);
printf("Heap: %p\n", malloc(4));
return 0;
}
使用cygwin的gcc编译,每次都得到相同的Stack地址和Heap地址,而在关闭aslr的情况下使用MSVC编译...
cl t.c /link /DYNAMICBASE:NO /NXCOMPAT:NO
...我每次都得到相同的 Stack 地址,但是 Heap 地址发生了变化。
我已经尝试添加注册表值HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages,但它不起作用。
【问题讨论】:
-
这不是
malloc的保证行为,并且从未在任何地方指定。如果您有其他要求,您应该考虑使用自己的malloc包装器来满足您的要求。但请记住,仅将该包装器用于您需要的测试。 -
你可以在windows中使用
VirtualAlloc()来分配一个特定的地址。请参阅以下问题:stackoverflow.com/questions/10364582/… -
@Someprogrammerdude 虽然确定性返回值不是 malloc 的保证行为,并且在缺乏虚拟内存硬件的系统中可能无法实现,但它是一个对调试有用的属性。同样,这也是伪随机生成器提供种子函数的原因之一。
-
我建议在这个问题中添加“windows”标签,因为它适用于在 Windows 下运行的所有程序,而不仅仅是那些使用 MSVC 编译的程序。
标签: c visual-c++ malloc