Запись Malloc - не может вернуть память - PullRequest
0 голосов
/ 30 ноября 2018

Я должен перекодировать функцию malloc (3) в C.
Я должен использовать системный вызов mmap () для выделения страниц.

Я уже сделал несколько версий, но, поскольку это не былоработая, я решил сделать небольшую и быструю версию в одной функции для отладки.

Вот как я собираю свою программу тестирования с помощью моего malloc:
gcc unit_test.c libft/libft.a -L. -lft_malloc
И вотВот как мой make-файл компилирует мой malloc.so:
gcc -g -shared -undefined dynamic_lookup -o libft_malloc.so srcs/malloc.c srcs/debug.c

Моя программа unit_test.c очень проста, я хочу распределить строку по размеру 10, установить весь ее символ в 'a', затем распечатайте его:

#include "libft/libft.h"
#include "incs/malloc.h"

int         main(void)
{
    ft_putstr_fd("TEST 01\n", 2);
    char    *str;
    int     i;

    str = NULL;
    str = (char *)malloc(sizeof(char) * 10);
    if (!str)
    {
        ft_putstr_fd("MALLOC FAILED\n", 2);
        return (-1);
    }

    ft_putstr_fd("MALLOC SUCCESS\n", 2);
    i = 0;
    while (i < 9)
    {
        str[i] = 'a';
        i++;
    }
    str[i] = '\0';
    ft_putchar_fd('\n', 2);
    ft_putstr_fd(str, 2);
    ft_putchar_fd('\n', 2);
    return (0);
}

Нет проблем.Он должен работать (он работает с настоящим malloc).

Вот как выглядит моя структура блока:

typedef struct          s_block
{
    size_t              size;
    char                *memory;
    struct s_block      *next;
    struct s_block      *prev;
}                       t_block;

размер - это размер запрашиваемой памяти, память - указательна первый адрес памяти, который я хочу вернуть (я преобразовал его в символ *), следующий и предыдущий, поскольку это связанный список.

Наконец, это моя функция malloc:

void        *malloc(size_t size)
{
    char        *memory;
    t_block     *block;
    int         i;
    size_t      total_size;

    memory = NULL;
    i = 0;

    total_size = size + sizeof(t_block);

    while (total_size % 16)    // Align memory
        total_size++;

    memory = mmap(0, total_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
    while (i < total_size)
    {
        memory[i] = 'z';
        i++;
    }
        db_putstr_fd("Printing memory...\n", 2);
        db_putstr_fd(memory, 2);
        db_putchar_fd('\n', 2);
    block = (t_block *)&memory;
    block->size = size;
    block->next = NULL;
    block->prev = NULL;
        db_putstr_fd("Block size = ", 2);
        db_putnbr_fd(block->size, 2);
        db_putchar_fd('\n', 2);
    block->memory = (char *)&block + sizeof(t_block);
    i = 0;
    while (i < block->size)
    {
            db_putstr_fd("i = ", 2);
            db_putnbr_fd(i, 2);
            db_putstr_fd("\tsize = ", 2);
            db_putnbr_fd(block->size, 2);
            db_putchar_fd('\n', 2);
        block->memory[i] = 'a';
        i++;
    }

        db_putstr_fd("Out of loop\n", 2);
        db_putstr_fd(block->memory, 2);
        db_putchar_fd('\n', 2);

    return (block->memory);
}

Итак, я отображаю память char * (будет заменен страницами, когда я буду уверен, что это будет работать).Я установил свой блок в начале этой памяти, а затем я инициализирую все переменные структур блока.
Моя проблема может заключаться в том, что я задаю строковый адрес блока.
Я добровольно сделал отступ для своих строк отладки, так каких много, так что вы можете лучше увидеть интересные линии;но я решил оставить их, чтобы показать вам результат:

TEST 01
Printing memory...
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Block size = 10
i = 0   size = 10
i = 1   size = 10
i = 2   size = 10
i = 3   size = 10
i = 4   size = 10
i = 5   size = 10
i = 6   size = 10
i = 7   size = 10
i = 8   size = 10
i = 9   size = 10
Out of loop
aaaaaaaaaa
[1]    59894 segmentation fault  ./a.out

Как вы можете видеть, я могу записать в память в моем malloc, но затем, когда я возвращаю его, программа segfault.Я думаю, что это происходит в строке 11 моего файла unit_test.c, но почему?

Как я могу записать в строку памяти функцию malloc, но затем не могу вернуть ее в программу, которая называется malloc?
Я что-то пропустил?

...