出于调试目的,我希望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进行编译,每次在关闭aslr的情况下使用MSVC进行编译时,我都会得到相同的堆栈地址和堆地址。
cl t.c /link /DYNAMICBASE:NO /NXCOMPAT:NO
...我每次都获得相同的堆栈地址,但是堆地址会更改。
我已经尝试添加注册表值HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages
,但是它不起作用。
出于调试目的,我希望malloc每次执行程序时都返回相同的地址,但是在MSVC中并非如此。例如:#include
堆栈地址和由malloc()
返回的指针每次都可能不同。事实上,当程序在Mac / OS上多次编译并运行时,两者都不同。
事实证明,您可能无法从MSVC运行时库获得确定性行为。 C / C ++运行时库的调试版本和生产版本最终都调用了名为_malloc_base()
的函数,该函数又调用了Win32 API函数HeapAlloc()。不幸的是,HeapAlloc()
或提供其堆的功能HeapCreate()都没有记录标志或其他获得确定性行为的方式。
堆的性质使得它为您提供了下一个可用段,该段可以位于任何位置。从理论上讲,可以通过malloc完成的底层API调用与计算机上的其他所有对象共享堆。