将Casablanca代码集成到现有C ++解决方案时的Memcpy异常

时间:2014-05-19 13:42:57

标签: c++ memcpy

我正在使用VS2010和Casablanca 1.2版将REST接口集成到现有的C ++解决方案中。如果我创建一个只有这个代码块的新解决方案,它可以完美地工作。当我将此代码放入现有的.cpp文件时,它会在创建具有memcpy异常的客户端对象时崩溃。我已经完成了属性文件的更新,以查看Casablanca(100)的正确版本,并添加了我的外部依赖项以及include和lib目录的路径。

代码块是:

try 
{
    http_client_config cimconfig;
    cimconfig.set_validate_certificates(false);

    http_client cimclient(L"https://dmaid52.corp.global/workplace",cimconfig);

    cimclient .request(methods::GET).then([](http_response response) {
        string_t theResponse = response.to_string();
    }).wait();
}
catch( const http_exception &e )
{
    printf("Exception status code %u returned. %s\n", e.error_code(), e.what());
}

创建cimclient时,我得到了异常。如果我删除对配置的引用并且只调用http_client cimclient(L"https://dmaid52.corp.global/workplace")它似乎工作正常,但它会在.request上抛出异常。

异常的调用堆栈如下。

msvcr100d.dll!_VEC_memcpy(void * dst, void * src, int len) + 0x46 bytes
cpprest100d_1_2.dll!_wmemcpy() + 0x31 bytes 
cpprest100d_1_2.dll!std::char_traits<wchar_t>::copy() + 0x2f bytes 
cpprest100d_1_2.dll!     std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> ::assign() + 0xb7 bytes 
cpprest100d_1_2.dll!    std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> ::basic_string<    wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >() + 0x86 bytes 
cpprest100d_1_2.dll!web::http::client::credentials::credentials() + 0x67 bytes 
cpprest100d_1_2.dll!web::http::client::http_client_config::http_client_config() + 0x6c bytes 
cpprest100d_1_2.dll!  web::http::client::details::_http_client_communicator::_http_client_communicator() + 0x73 bytes cpprest100d_1_2.dll!web::http::client::details::winhttp_client::winhttp_client() + 0x52 bytes 
cpprest100d_1_2.dll!std::tr1::_Ref_count_obj<web::http::client::details::winhttp_client>::_Ref_count_obj<web::http::client::details::winhttp_client><web::http::uri const &,web::http::client::http_client_config const &>() + 0xa6 bytes 
cpprest100d_1_2.dll!std::tr1::make_shared<web::http::client::details::winhttp_client,web::http::uri const &,web::http::client::http_client_config const &>() + 0x8f bytes 
cpprest100d_1_2.dll!web::http::client::http_network_handler::http_network_handler() + 0x70 bytes 
cpprest100d_1_2.dll!std::tr1::_Ref_count_obj<web::http::client::http_network_handler>::_Ref_count_obj<web::http::client::http_network_handler><web::http::uri const &,web::http::client::http_client_config const &>() + 0xa3 bytes 
cpprest100d_1_2.dll!std::tr1::make_shared<web::http::client::http_network_handler,web::http::uri const &,web::http::client::http_client_config const &>() + 0x8c bytes 
cpprest100d_1_2.dll!web::http::client::http_client::build_pipeline() + 0x6f bytes 
cpprest100d_1_2.dll!web::http::client::http_client::http_client() + 0x74 bytes 
Hl7.exe!CChartSchedule::sendScheduleToCIM(QMsgSchedule * pMsg) Line 146 + 0x35 bytes C++

我已经搜索了高低,尝试找到这个错误的解决方案但没有用。我认为它可能是项目设置中的某个设置,但我将独立项目与我的集成项目进行了比较,并且无法提出任何建议。

1 个答案:

答案 0 :(得分:0)

我已经陷入了非常相似的境地。

在我的情况下,问题出现在casablanca库和目标可执行文件的不同构建设置中。 Casablanca是在一个静态库中构建的,其中一组定义和最终项目使用了其他一组定义。这导致卡萨布兰卡内部结构的大小不同,导致非常奇怪的行为和意想不到的结果。

Visual Studio给了我这个错误:Stack cookie instrumentation code detected a stack-based buffer overrun.

我通过检查项目和卡萨布兰卡项目中的sizeof(http_client_config)找到了问题的根源。

分辨率很简单 - 在两个项目中设置相同的定义。