如何使用MSVC每次使malloc返回相同的地址?

问题描述 投票:2回答:3

出于调试目的,我希望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 #include <...>

c visual-c++ malloc
3个回答
1
投票

堆栈地址和由malloc()返回的指针每次都可能不同。事实上,当程序在Mac / OS上多次编译并运行时,两者都不同。


1
投票

事实证明,您可能无法从MSVC运行时库获得确定性行为。 C / C ++运行时库的调试版本和生产版本最终都调用了名为_malloc_base()的函数,该函数又调用了Win32 API函数HeapAlloc()。不幸的是,HeapAlloc()或提供其堆的功能HeapCreate()都没有记录标志或其他获得确定性行为的方式。


0
投票

堆的性质使得它为您提供了下一个可用段,该段可以位于任何位置。从理论上讲,可以通过malloc完成的底层API调用与计算机上的其他所有对象共享堆。

© www.soinside.com 2019 - 2024. All rights reserved.