yhirose/cpp-httplib

A serious problem, crash ... because of request default constructor error!!!!!!!

aijyo opened this issue · 3 comments

Develop environment:
Microsoft Visual Studio Community 2019
version 16.11.27

C++17

x64 debug

cpp-httplib: master f14accb
Problem description:
Just as the image shows (below), httplib::Request default constructor can not initialize request.content_length_ to zero(not all environment reappear,During my use, I only reproduced it in my project.If you don’t believe me, I can provide you with the video. Since the project is very large and the environment is complicated, I cannot provide you with this project...), I don't know why, I wanna report a bug to the Microsoft compiler, but I don’t know how,If anyone has any good ideas or suggestions on how to deal with this problem, please help me!!

debug shows an error value
image
image

request code(master f14accb):
image

request default constructor generated by compile:

test.exe!httplib::Request::Request(void):
00007FF725F664C0 mov qword ptr [rsp+8],rcx
00007FF725F664C5 push rbp
00007FF725F664C6 push rdi
00007FF725F664C7 sub rsp,0E8h
00007FF725F664CE lea rbp,[rsp+20h]
00007FF725F664D3 mov rax,qword ptr [this]
00007FF725F664DA mov rcx,rax
00007FF725F664DD call std::basic_string<char,std::char_traits,std::allocator >::basic_string<char,std::char_traits,std::allocator > (07FF725ED1D90h)
00007FF725F664E2 nop
00007FF725F664E3 mov rax,qword ptr [this]
00007FF725F664EA add rax,28h
00007FF725F664EE mov rcx,rax
00007FF725F664F1 call std::basic_string<char,std::char_traits,std::allocator >::basic_string<char,std::char_traits,std::allocator > (07FF725ED1D90h)
00007FF725F664F6 nop
00007FF725F664F7 mov rax,qword ptr [this]
00007FF725F664FE add rax,50h
00007FF725F66502 mov rcx,rax
00007FF725F66505 call std::multimap<std::basic_string<char,std::char_traits,std::allocator >,std::basic_string<char,std::char_traits,std::allocator >,httplib::detail::ci,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,std::basic_string<char,std::char_traits,std::allocator > > > >::multimap<std::basic_string<char,std::char_traits,std::allocator >,std::basic_string<char,std::char_traits,std::allocator >,httplib::detail::ci,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,std::basic_string<char,std::char_traits,std::allocator > > > > (07FF725EC0B08h)
00007FF725F6650A nop
00007FF725F6650B mov rax,qword ptr [this]
00007FF725F66512 add rax,68h
00007FF725F66516 mov rcx,rax
00007FF725F66519 call std::basic_string<char,std::char_traits,std::allocator >::basic_string<char,std::char_traits,std::allocator > (07FF725ED1D90h)
00007FF725F6651E nop
00007FF725F6651F mov rax,qword ptr [this]
00007FF725F66526 add rax,90h
00007FF725F6652C mov rcx,rax
00007FF725F6652F call std::basic_string<char,std::char_traits,std::allocator >::basic_string<char,std::char_traits,std::allocator > (07FF725ED1D90h)
00007FF725F66534 nop
00007FF725F66535 mov rax,qword ptr [this]
00007FF725F6653C mov dword ptr [rax+0B8h],0FFFFFFFFh
00007FF725F66546 mov rax,qword ptr [this]
00007FF725F6654D add rax,0C0h
00007FF725F66553 mov rcx,rax
00007FF725F66556 call std::basic_string<char,std::char_traits,std::allocator >::basic_string<char,std::char_traits,std::allocator > (07FF725ED1D90h)
00007FF725F6655B nop
00007FF725F6655C mov rax,qword ptr [this]
00007FF725F66563 mov dword ptr [rax+0E8h],0FFFFFFFFh
00007FF725F6656D mov rax,qword ptr [this]
00007FF725F66574 add rax,0F0h
00007FF725F6657A mov rcx,rax
00007FF725F6657D call std::basic_string<char,std::char_traits,std::allocator >::basic_string<char,std::char_traits,std::allocator > (07FF725ED1D90h)
00007FF725F66582 nop
00007FF725F66583 mov rax,qword ptr [this]
00007FF725F6658A add rax,118h
00007FF725F66590 mov rcx,rax
00007FF725F66593 call std::basic_string<char,std::char_traits,std::allocator >::basic_string<char,std::char_traits,std::allocator > (07FF725ED1D90h)
00007FF725F66598 nop
00007FF725F66599 mov rax,qword ptr [this]
00007FF725F665A0 add rax,140h
00007FF725F665A6 mov rcx,rax
00007FF725F665A9 call std::multimap<std::basic_string<char,std::char_traits,std::allocator >,std::basic_string<char,std::char_traits,std::allocator >,std::less<std::basic_string<char,std::char_traits,std::allocator > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,std::basic_string<char,std::char_traits,std::allocator > > > >::multimap<std::basic_string<char,std::char_traits,std::allocator >,std::basic_string<char,std::char_traits,std::allocator >,std::less<std::basic_string<char,std::char_traits,std::allocator > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,std::basic_string<char,std::char_traits,std::allocator > > > > (07FF725EBA749h)
00007FF725F665AE nop
00007FF725F665AF mov rax,qword ptr [this]
00007FF725F665B6 add rax,158h
00007FF725F665BC mov rcx,rax
00007FF725F665BF call std::multimap<std::basic_string<char,std::char_traits,std::allocator >,httplib::MultipartFormData,std::less<std::basic_string<char,std::char_traits,std::allocator > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,httplib::MultipartFormData> > >::multimap<std::basic_string<char,std::char_traits,std::allocator >,httplib::MultipartFormData,std::less<std::basic_string<char,std::char_traits,std::allocator > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,httplib::MultipartFormData> > > (07FF725ED2D49h)
00007FF725F665C4 nop
00007FF725F665C5 mov rax,qword ptr [this]
00007FF725F665CC add rax,170h
00007FF725F665D2 mov rcx,rax
00007FF725F665D5 call std::vector<std::pair<__int64,__int64>,std::allocator<std::pair<__int64,__int64> > >::vector<std::pair<__int64,__int64>,std::allocator<std::pair<__int64,__int64> > > (07FF725ECFBCBh)
00007FF725F665DA nop
00007FF725F665DB mov rax,qword ptr [this]
00007FF725F665E2 add rax,190h
00007FF725F665E8 mov rcx,rax
00007FF725F665EB call std::match_results<std::_String_const_iterator<std::_String_val<std::_Simple_types > >,std::allocator<std::sub_match<std::_String_const_iterator<std::_String_val<std::_Simple_types > > > > >::match_results<std::_String_const_iterator<std::_String_val<std::_Simple_types > >,std::allocator<std::sub_match<std::_String_const_iterator<std::_String_val<std::_Simple_types > > > > > (07FF725EC4B40h)
00007FF725F665F0 nop
00007FF725F665F1 mov rax,qword ptr [this]
00007FF725F665F8 add rax,278h
00007FF725F665FE mov rcx,rax
00007FF725F66601 call std::unordered_map<std::basic_string<char,std::char_traits,std::allocator >,std::basic_string<char,std::char_traits,std::allocator >,std::hash<std::basic_string<char,std::char_traits,std::allocator > >,std::equal_to<std::basic_string<char,std::char_traits,std::allocator > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,std::basic_string<char,std::char_traits,std::allocator > > > >::unordered_map<std::basic_string<char,std::char_traits,std::allocator >,std::basic_string<char,std::char_traits,std::allocator >,std::hash<std::basic_string<char,std::char_traits,std::allocator > >,std::equal_to<std::basic_string<char,std::char_traits,std::allocator > >,std::allocator<std::pair<std::basic_string<char,std::char_traits,std::allocator > const ,std::basic_string<char,std::char_traits,std::allocator > > > > (07FF725EC9D98h)
00007FF725F66606 mov rax,qword ptr [this]
00007FF725F6660D add rax,2C8h
00007FF725F66613 mov rcx,rax
00007FF725F66616 call std::function<bool __cdecl(httplib::Response const & __ptr64)>::function<bool __cdecl(httplib::Response const & __ptr64)> (07FF725EC478Ah)
00007FF725F6661B mov rax,qword ptr [this]
00007FF725F66622 add rax,308h
00007FF725F66628 mov rcx,rax
00007FF725F6662B call std::function<bool __cdecl(char const * __ptr64,unsigned __int64,unsigned __int64,unsigned __int64)>::function<bool __cdecl(char const * __ptr64,unsigned __int64,unsigned __int64,unsigned __int64)> (07FF725ECFEC8h)
00007FF725F66630 mov rax,qword ptr [this]
00007FF725F66637 add rax,348h
00007FF725F6663D mov rcx,rax
00007FF725F66640 call std::function<bool __cdecl(unsigned __int64,unsigned __int64)>::function<bool __cdecl(unsigned __int64,unsigned __int64)> (07FF725ECBD00h)
00007FF725F66645 mov rax,qword ptr [this]
00007FF725F6664C mov qword ptr [rax+388h],14h
00007FF725F66657 mov rax,qword ptr [this]
00007FF725F6665E mov qword ptr [rax+390h],0
00007FF725F66669 mov rax,qword ptr [this]
00007FF725F66670 add rax,398h
00007FF725F66676 mov rcx,rax
00007FF725F66679 call std::function<bool __cdecl(unsigned __int64,unsigned __int64,httplib::DataSink & __ptr64)>::function<bool __cdecl(unsigned __int64,unsigned __int64,httplib::DataSink & __ptr64)> (07FF725EBF000h)
00007FF725F6667E mov rax,qword ptr [this]
00007FF725F66685 mov byte ptr [rax+3D8h],0
00007FF725F6668C mov rax,qword ptr [this]
00007FF725F66693 mov qword ptr [rax+3E0h],0
00007FF725F6669E mov rax,qword ptr [this]
00007FF725F666A5 lea rsp,[rbp+0C8h]
00007FF725F666AC pop rdi
00007FF725F666AD pop rbp
00007FF725F666AE ret
00007FF725F666AF int 3
00007FF725F666B0 int 3
00007FF725F666B1 int 3
00007FF725F666B2 int 3

image
00007FF74D0C6657 mov rax,qword ptr [this]
00007FF74D0C665E mov qword ptr [rax+390h],0
this code set size_t redirect_count_ = CPPHTTPLIB_REDIRECT_MAX_COUNT;
So it was time to assign a value to content_length_, but it didn't...

Right assembly code:
image

False assembly code:
image

Solved, I use httplib with CPPHTTPLIB_OPENSSL_SUPPORT ,since httplib is used in many places, one file forgot to #define CPPHTTPLIB_OPENSSL_SUPPORT when #include <http/httplib.h>, and it happened that the compiler compiled that httplib first, and then the problem occurred...
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include <http/httplib.h>