Ошибка сегментации при доступе к возвращенному указателю - PullRequest
1 голос
/ 12 октября 2019

У меня есть структура данных, которая содержит размер данных и сами данные, и у меня также есть две функции, которые сериализуют десериализацию той же структуры.

Обратите внимание, что эти функции сериализации не совсем практичны или эффективны.

Моя data_t структура:

struct data_t {
    int datasize; 
    void *data; 
};

Моя функция data_To_buffer, которая преобразует структуру в буфер:

int data_to_buffer(struct data_t *data, char **data_buf) {
    if (data == NULL || data_buf == NULL)
        return -1;

    int buf_size = INT_S + data -> datasize;

    *data_buf = malloc(buf_size);
    char *buf_ptr = *data_buf;


    int int_v = htonl(data -> datasize);
    memcpy(buf_ptr, &int_v, INT_S);
    buf_ptr += INT_S;

    memcpy(buf_ptr, data -> data, data -> datasize);

    return buf_size;
}

Моя функция buffer_to_data, котораяпреобразует буфер в объект data_t.

struct data_t *buffer_to_data(char *data_buf, int data_buf_size) {
    if(data_buf == NULL || data_buf_size <= 0)
        return NULL;

    int size = ntohl(* (int *) data_buf);
    data_buf += INT_S;

    struct data_t *data = data_create(size);


    memcpy(data -> data, data_buf, data -> datasize);

    printf("\n SIZE: %d", data -> datasize); <- OK = 14
    printf("\n Data: %s\n", data -> data); <- OK = 1234567890abc
    return data;
}

Проблема

В моем main при тестировании этих функций возникает ошибка при попытке печатизначение десериализованных данных.

Обратите внимание, что когда я печатаю data и datasize в функции buffer_to_data, проблем вообще не возникает, только после возврата данных возникает ошибка.

int main() {
int data_size;
    struct data_t *data, *data2;
    char *data_s = strdup("1234567890abc");
    char *data_buf;
    data_size = strlen(data_s)+1;

    data = data_create2(data_size, data_s); <- OK

    int buf_size = data_to_buffer(data, &data_buf); <- OK

    data2 = buffer_to_data(data_buf, buf_size);

    printf("\n DATA2 SIZE: %d", data2 -> datasize); <- SEGMENTATION FAULT 
    printf("\n DATA2 Data: %s\n", data2 -> data);

    ...
}

1 Ответ

0 голосов
/ 12 октября 2019

Здесь:

memcpy(buf_ptr, &int_v, INT_S);

Отсутствует разыменование внутреннего буфера, вместо этого вы переопределяете переданный указатель

Фиксированная строка:

memcpy(*buf_ptr, &int_v, INT_S);

Та же ошибка здесь:

buf_ptr += INT_S;
memcpy(buf_ptr, data -> data, data -> datasize);

Фиксированный вариант:

memcpy(*buf_ptr + INT_S, data -> data, data -> datasize);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...