Есть странные функции malloc, которые я не использовал

Я использую пин-код для анализа моей простой программы.

Он имеет 4 функции malloc, однако, когда я использую pin с pintool под названием malloctrace, он показывает более 4 malloc.

Каковы эти функции malloc?

Моя ОС Ubuntu 12.04 64bit. ниже пунктов код, что я делаю и результат пинтоин.

#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;
}

       name           size          start_addr           malloc_IP          access_cnt
     malloc          0x589                   0      0x7ffff7de557e                   0
     malloc          0x489                   0      0x7ffff7de557e                   0
     malloc            0xf                   0      0x7ffff7ddd29e                   0
     malloc           0x4b                   0      0x7ffff7df01b2                   0
     malloc           0x28                   0      0x7ffff7de1fe7                   0
     malloc         0x14a0                   0      0x7ffff7de202c                   0
     malloc           0x28                   0      0x7ffff7de22ad                   0
     malloc           0x48                   0      0x7ffff7ddf9d3                   0
     malloc           0x5c                   0      0x7ffff7ddf9d3                   0
     malloc           0x5c                   0      0x7ffff7ddf9d3                   0
     malloc           0x39                   0      0x7ffff7ddf9d3                   0
     malloc           0x20                   0      0x7ffff7de294e                   0
     malloc          0x492                   0      0x7ffff7de557e                   0
     malloc           0x20                   0      0x7ffff7de57ed                   0
     malloc           0x28                   0      0x7ffff7de776f                   0
     malloc           0x38                   0      0x7ffff7de7900                   0
     malloc           0x48                   0      0x7ffff7deab5a                   0
     malloc           0x48                   0      0x7ffff7deab5a                   0
     malloc          0x228                   0      0x7ffff7deab5a                   0
     malloc           0x90                   0      0x7ffff7deab5a                   0
     malloc          0x410                   0      0x7ffff7ddaf22                   0
     malloc          0x110                   0      0x7ffff7debd52                   0
     malloc          0x190                   0            0x4013d2                   0
     malloc          0x190            0x603010            0x4013d2                   0
     malloc          0x190            0x6031b0            0x4013e0                   0
     malloc           0x40            0x603350            0x4013ee                   0
     malloc          0x190            0x6033a0            0x4013fc                   0
       free              0                   0            0x401688                   0
       free              0                   0            0x401688                   0
       free              0                   0            0x401688                   0
       free              0                   0            0x401688                   0
       free              0                   0            0x4016b0                   0
       free              0                   0            0x4016b0                   0
       free              0                   0            0x4016d7                   0
       free              0                   0            0x4016d7                   0
       free              0                   0            0x4016d7                   0
       free              0                   0            0x4016d7                   0
       free              1                   0            0x4016e8                   0
       free              0                   0            0x4016e8                   0
       free              0                   0            0x401718                   0
       free              0                   0            0x401718                   0

3 ответа

Важные для вас вызовы malloc это

 malloc          0x190            0x603010            0x4013d2                   0
 malloc          0x190            0x6031b0            0x4013e0                   0
 malloc           0x40            0x603350            0x4013ee                   0
 malloc          0x190            0x6033a0            0x4013fc    

Остальные вызываются изнутри некоторыми системными вызовами.

Вполне возможно, что другие вещи могут вызывать malloc под обложками, включая код времени выполнения C (например, для потоковых данных, используемых такими вещами, как strtok) или даже сам инструмент анализа.

Если вы изучите начальный адрес всех этих блоков памяти, вы заметите, что все, кроме тех, которые вы делаете, 0 (100 4 байта int переменные принимают оп 400 или же 0x190 байт, 16 из них занимают 64 или же 0x40 байт).

Это может быть уместно здесь, хотя также может быть, что вы единственный, кто не убирает за собой:-)


Кстати, вы не должны разыгрывать возвращаемое значение malloc в C, так как он может скрыть некоторые тонкие ошибки, например, когда ваш int и размеры указателя разной ширины, и вы забыли включить stdlib.hи то, и другое здесь возможно, если вы работаете в 64-битной среде.

С вполне способен на неявное приведение void * вернулся из malloc в любой другой тип указателя.

Вы можете использовать GDB, чтобы узнать, что происходит и кто звонит malloc(), В вашем случае вы увидите много перерывов в ld-linux.so:

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

Функция _start - это точка входа в программу, которая вызывается перед функцией main(). Таким образом, он не виден в тексте программы, но он существует, и у него есть вызовы к различным функциям во время запуска.
Также есть ldd Утилита, которая показывает все динамические библиотеки, используемые исполняемым файлом:

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().

Другие вопросы по тегам