有一些奇怪的malloc函数我没有使用

有一些奇怪的malloc函数我没有使用,c,memory-management,malloc,intel-pin,C,Memory Management,Malloc,Intel Pin,我使用pin分析我的简单程序 它有4个malloc函数,但是,当我将pin与名为malloctrace的pintool一起使用时,它显示了4个以上的malloc 这些malloc函数是什么 我的操作系统是Ubuntu 12.04 64位。以下是我制作的代码和pintool的结果 #include <stdio.h> #define SIZE 100 int main() { int *test1 = (int*)malloc(SIZE* sizeof(int));

我使用pin分析我的简单程序

它有4个malloc函数,但是,当我将pin与名为malloctrace的pintool一起使用时,它显示了4个以上的malloc

这些malloc函数是什么

我的操作系统是Ubuntu 12.04 64位。以下是我制作的代码和pintool的结果

#include <stdio.h>
#define SIZE 100

int main()
{
    int *test1 = (int*)malloc(SIZE* sizeof(int));
    int *test2 = (int*)malloc(SIZE* sizeof(int));
    int i, j;
    int *test3 = (int*)malloc(16*sizeof(int));
    int *test4 = (char*)malloc(SIZE* sizeof(int));

    test1[0] = 2;
    test1[2] = 3;
    test2[0] = 5;

    printf("test1's addr : %p , test1's val = %d    \n", test1, test1[0]);
    printf("test1's addr : %p , test1's val = %d    \n", &test1[1], test1[1]);
    printf("test2's addr : %p , test2's val = %d    \n", &test1[9], test1[9]);


    return 0;
}

很可能还有其他东西在幕后调用
malloc
,包括C运行时代码(例如,对于strtok之类的东西使用的特定于线程的数据),甚至是您的分析工具本身

如果您检查所有这些内存块的起始地址,您会注意到,除了您所做的以外,所有内存块都是
0
(100个4字节
int
变量取op
400
0x190
字节,其中16个占
64
0x40
字节)

这可能与此相关,但也可能是你是唯一一个没有清理自己的人:-)


顺便说一下,您不应该在C中强制转换
malloc
的返回值,因为它可以隐藏某些细微的错误,例如当
int
和指针大小的宽度不同时,您忘记了包含
stdlib.h
,如果您在64位环境中运行,这两种情况在这里都是可能的


C完全能够将从
malloc
返回的
void*
隐式转换为任何其他指针类型。

您可以使用gdb找出发生了什么以及谁调用了
malloc()
。在您的案例中,您将看到ld-linux中出现了许多中断。因此:

Breakpoint 3, malloc (n=n@entry=136) at dl-minimal.c:93
93  in dl-minimal.c
(gdb) where
#0  malloc (n=n@entry=136) at dl-minimal.c:93
#1  0xb7ff3baa in calloc (nmemb=nmemb@entry=17, size=size@entry=8) at dl-minimal.c:113
#2  0xb7fef628 in allocate_dtv (result=result@entry=0xb7e00900) at dl-tls.c:296
#3  0xb7fefaf8 in _dl_allocate_tls_storage () at dl-tls.c:364
#4  0xb7fdecc7 in init_tls () at rtld.c:771
#5  0xb7fe0fcd in dl_main (phdr=0x8048034, phnum=9, user_entry=0xbfffedbc, auxv=0xbfffef5c) at rtld.c:1819
#6  0xb7ff33b6 in _dl_sysdep_start (start_argptr=start_argptr@entry=0xbfffee50, dl_main=dl_main@entry=0xb7fdf720 <dl_main>) at ../elf/dl-sysdep.c:241
#7  0xb7fe2dd4 in _dl_start_final (arg=0xbfffee50) at rtld.c:337
#8  _dl_start (arg=0xbfffee50) at rtld.c:563
#9  0xb7fdf197 in _start () from /lib/ld-linux.so.2

因此,任何链接到可执行文件库的文件都可以使用malloc()

 malloc          0x190            0x603010            0x4013d2                   0
 malloc          0x190            0x6031b0            0x4013e0                   0
 malloc           0x40            0x603350            0x4013ee                   0
 malloc          0x190            0x6033a0            0x4013fc    
一些系统调用正在内部调用Rest

ldd main
    linux-gate.so.1 =>  (0xb7724000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7547000)
    /lib/ld-linux.so.2 (0xb7725000)
 malloc          0x190            0x603010            0x4013d2                   0
 malloc          0x190            0x6031b0            0x4013e0                   0
 malloc           0x40            0x603350            0x4013ee                   0
 malloc          0x190            0x6033a0            0x4013fc