我想知道指针是否指向使用malloc / new分配的内存。我意识到任意地址的答案是“不,你不能”,但我认为可以覆盖malloc / free并跟踪分配的内存范围。
您是否知道提供此特定工具的内存管理库? 你知道生产代码吗?
Valgrind很棒,但是仪表太多(慢)并且威尔说我们不想像这样使用Valgrind(使软碰撞变得足够好)。
Mudflap是一个非常好的解决方案,但是专门用于GCC,遗憾的是,检查不会简单地返回布尔值(请参阅下面的答案)。
请注意,检查内存写入是否合法是security issue。所以寻找表现是有动力的。
答案 0 :(得分:13)
可能无法完成的证明:
char * p1 = malloc(1);
free( p1 );
char * p2 = malloc(1); // probably allocates same block as first malloc
现在p1和p2都指向堆上的相同内存,但只有p2有效。
答案 1 :(得分:10)
没有标准的方法可以做到这一点,但各种malloc调试工具可能有办法做到这一点。例如,如果您使用valgrind,则可以使用VALGRIND_CHECK_MEM_IS_ADDRESSABLE
来检查此相关内容
答案 2 :(得分:5)
如果性能不是您的应用程序的真正问题,您可以自己执行此操作:
定义MyMalloc(...)和MyFree(...),在其中,与调用malloc / free一起,更新一个(有序的)对列表{address - malloc的结果,blockSize - amt请求的内存}。然后当你需要检查指针p时,你会找到一对满足:address< = p< = address + blockSize。
可以/应该检查其他条件,如果你想实际使用那个指针,这只会告诉你地址是否正在使用。
答案 3 :(得分:2)
Mudflap(对于gcc)似乎很甜蜜。你必须编译你的软件,但它会检查任何错误的指针访问(堆/堆栈/静态)。它设计用于生产代码,减速估计在x1.5到x5之间。您还可以禁用读取访问时的检查以加快速度 用户检查可以使用
执行void __mf_check (void *ptr, __mf_size_t sz, int type, const char *location)
调用此函数会导致:no,fork to gdb,segv或abort,具体取决于环境参数。
答案 4 :(得分:1)
您可以使用LD_PRELOAD,并将malloc包装在您自己的函数中。
答案 5 :(得分:1)
请参阅我们的CheckPointer工具,该工具将检查每个指针访问的有效性。它不是特别快,但它会捕获甚至Valgrind都不会捕获的错误(例如,指向解除分配的堆栈帧的指针等)
Another answer to this question显示了对指针有效性进行纯内存范围检查无法检测到问题的情况。他是对的,因为如果只有内存范围地址,则无法可靠地检查重新分配的存储块是否被滥用。这称为 temporal 错误。通过将分配事件与内存块以及范围相关联,您可以检测到这一点。 Checkpointer执行此操作,并将检测错误。
答案 6 :(得分:0)
内存分配具有(虚拟)地址和长度。
指针只包含地址。
如果您单独跟踪长度,可以检查其包含的内容,例如:
int check_contained(const char* src,size_t srclen,const char* sub,size_t sublen) {
return (sub >= src) && (sub+sublen < src+srclen);
}
Symbian有一个AllocLen
函数,但没有POSIX和win32等价。
答案 7 :(得分:0)
我做了类似的事情,但不记得它是如何编码的,我手边没有代码。
但基本思路是覆盖基类的new
和delete
。在new
中设置了静态标记(例如bool inDynamicAlloc=true
)。在基类的构造函数中询问此标志。
当它成立时,对象被分配在堆上,否则就在堆栈上。
构造函数后来重置了标志。
希望这有帮助。
答案 8 :(得分:0)
您可以使用conservative garbage collector使用的相同技术来确定类似指针的对象是否指向堆。事实上,您可能会从bdwgc本身获取源代码。这将是一项非常重要的任务,但它可以根据需要控制和移植。 (事实上,大部分移植工作已经完成。)
答案 9 :(得分:0)
你可以通过在malloc_size(my_ptr)
中调用malloc/malloc.h
来返回malloc为你的指针分配的大小,如果没有分配指针则返回0。请记住,malloc会调整已分配块的大小,以确保可以从该指针取消引用最具限制性的类型变量并对齐内存。因此,如果调用malloc(1)(以及malloc(0)),malloc实际上返回16个字节(在大多数机器上),因为限制性最强的类型的大小为16个字节