Libcurl - curl_multi_info_read - ошибка доступа
Подскажите пожалуйста, из за чего ошибка доступа получается при обращении к полю структуры CURLMsg:
Вот простенький код, который я и использую:
#include <iostream>
#include <string>
#include <curl.h>
int main()
{
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl;
if (curl == CURL_OK)
{
CURLcode curl_easy_setopt_status;
curl_easy_setopt(curl, CURLOPT_URL, "https://www.cyberforum.com"); //сайт с заведомо некорректным сертификатом
curl_easy_setopt_status = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); //Установка редиректа
curl_easy_setopt_status = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10); //Установка кол-ва редиректов
curl_easy_setopt_status = curl_easy_setopt(CURL_p, CURLOPT_SSL_VERIFYPEER, 1);
curl_easy_setopt_status = curl_easy_setopt(CURL_p, CURLOPT_SSL_VERIFYHOST, 1);
//Запуск http-запроса: ------->
CURLM* multi_handle;
CURLMcode CURLMcode_;
int still_running = 0;
multi_handle = curl_multi_init();
curl_multi_add_handle(multi_handle, curl);
CURLMcode_ = curl_multi_perform(multi_handle, &still_running);
CURLMsg* my_CURLMsg_multi_info_read; //Структура возвращаемая функцией curl_multi_info_read.
int my_msgs_in_queue_int;
while (still_running != 0)
{
CURLMcode_ = curl_multi_perform(multi_handle, &still_running);
if (CURLMcode_ == 0)
{
CURLMcode_ = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
}
else
{
break;
}
my_CURLMsg_multi_info_read = curl_multi_info_read(multi_handle, &my_msgs_in_queue_int); //Запрашиваю структуру CURLMsg.
if (my_CURLMsg_multi_info_read != 0) //Если указатель действительный, то:
{
if (my_CURLMsg_multi_info_read->msg == CURLMSG_DONE)
{
//Теперь пытаюсь обратится к первому байту поля whatever:
std::cout << "whatever_address:" << my_CURLMsg_multi_info_read->data.whatever <<std::endl; //АДРЕСС НЕ НУЛЕВОЙ, то есть указатель действительный.
std::cout << "whatever:" << ((char*)(*my_CURLMsg_multi_info_read).data.whatever)[0] << std::endl; //ТУТ я терплю ОШИБКУ ДОСТУПА! Почему же так?
}
}
}
return 0;
}
Сама структура CURLMSG выглядит так:
struct CURLMsg
{
CURLMSG msg; // what this message means == CURLMSG_DONE
CURL* easy_handle; // the handle it concerns
union
{
void* whatever; // message-specific data
CURLcode result; // return code for transfer
} data;
};
Если полю whatever - указателю на void - присвоен адрес, то значит хотя бы доступ к 1 байту, то я должен иметь, почему ошибка доступа то получается ?
Ответы (1 шт):
When msg is CURLMSG_DONE, the message identifies a transfer that is done, and then result contains the return code for the easy handle that just completed.
Соответственно поле whatever не активно и обращение к нему влечет UB.
И даже если указателю на void присвоен адрес, то это совсем не значит, что этот адрес валидный, или что по нему есть доступ хотя бы к 1 байту