And*_*asT 11 c c++ malloc memory-management
我从C风格函数中获得了指向一大块已分配内存的指针.现在,调试目的非常有趣,以了解此指针指向的已分配内存块有多大.
是否有什么比通过盲目地越过边界而挑起异常更优雅?
提前谢谢,安德烈亚斯
我在Windows上使用VC++ 2005,在Linux上使用GCC 4.3
我_msize在VC++ 2005下不幸的是它在调试模式下导致异常....
好.我尝试过上面描述的方式,但有效.至少在我调试并确保在调用库退出后立即执行时,我会在缓冲区边界上运行.奇迹般有效.
它只是不优雅,绝不可用于生产代码.
Mar*_*ett 23
它不是标准的,但如果你的库有一个msize()能给你大小的功能.
一个常见的解决方案是malloc使用您自己的函数进行包装,记录每个请求以及大小和结果内存范围,在发布版本中您可以切换回"真实" malloc.
小智 12
如果您不介意为了调试而使用低级暴力,您可以#define宏来挂接对malloc和free的调用,并使用大小填充前4个字节.
为了调整
void *malloc_hook(size_t size) {
size += sizeof (size_t);
void *ptr = malloc(size);
*(size_t *) ptr = size;
return ((size_t *) ptr) + 1;
}
void free_hook (void *ptr) {
ptr = (void *) (((size_t *) ptr) - 1);
free(ptr);
}
size_t report_size(ptr) {
return * (((size_t *) ptr) - 1);
}
Run Code Online (Sandbox Code Playgroud)
然后
#define malloc(x) malloc_hook(x)
Run Code Online (Sandbox Code Playgroud)
等等
Gre*_*ill 10
C运行时库不提供此类功能.故意,故意挑衅异常不会告诉你这个块有多大.
通常,在C中解决此问题的方法是维护一个单独的变量,该变量跟踪分配的块的大小.当然,这有时不方便,但通常没有其他方法可以知道.
您的C运行时库可能提供一些堆调试函数,可以查询已分配的块(毕竟,free()需要知道块有多大),但任何此类事物都是不可移植的.
随着gcc和GNU linker,你可以轻松包装malloc
#include <stdlib.h>
#include <stdio.h>
void* __real_malloc(size_t sz);
void* __wrap_malloc(size_t sz)
{
void *ptr;
ptr = __real_malloc(sz);
fprintf(stderr, "malloc of size %d yields pointer %p\n", sz, ptr);
/* if you wish to save the pointer and the size to a data structure,
then remember to add wrap code for calloc, realloc and free */
return ptr;
}
int main()
{
char *x;
x = malloc(103);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并编译
gcc a.c -o a -Wall -Werror -Wl,--wrap=malloc
Run Code Online (Sandbox Code Playgroud)
(当然,如果你愿意的话,这也适用于用g ++编译的c ++代码,以及新的运算符(通过它的错位名称).)
实际上,静态/动态加载的库也将使用您的__wrap_malloc.
| 归档时间: |
|
| 查看次数: |
30426 次 |
| 最近记录: |