繁体   English   中英

使用C ++ STL理解addr2line消息

[英]Making sense of the addr2line message with C++ STL

我一直遇到这种罕见的段错误,并且在调试它时,我设法从addr2line程序获取以下输出。

void std::string::_S_copy_chars<__gnu_cxx::__normal_iterator<unsigned char 
const*, std::vector<unsigned char, std::allocator<unsigned char> > > >
(char*, __gnu_cxx::__normal_iterator<unsigned char const*, 
std::vector<unsigned char, std::allocator<unsigned char> > >,
__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, 
std::allocator<unsigned char> > >)
??:?

由于_S_copy_chars()是std :: string中的私有函数,因此我显然不直接调用它。 但是我无法猜测哪个公共函数正在调用它。 如果我能弄清楚public函数,则可以归零导致段错误的null取消引用。

我怀疑以下代码...

std::string CInProtocolBase::RetrieveStr(std::vector<unsigned 
char>::const_iterator& iter)
{
    unsigned long sizeOfStr;
    const unsigned char& size = *iter;
    memcpy(&sizeOfStr,&size,4);
    sizeOfStr = 
    boost::asio::detail::socket_ops::network_to_host_long(sizeOfStr);
    std::string str(iter+4,iter+4+sizeOfStr); // <= Could this be culprit??
    iter += (4 + sizeOfStr);
    return str;
}

其他候选人是这样的:

std::string CInProtocolBase::VectorToStr(const std::vector<unsigned char>& vec)
{
    return std::string(vec.begin(),vec.end());
}

使用memcpy(&sizeOfStr,&size,4)我看到了两个问题。

第一个是从一个字节的变量中复制四个字节。 那是明显的不确定行为

第二个是sizeOfStr可能是8个字节(在64位系统上,GCC通常long为64位)。 这将使部分变量未初始化,因此不确定,从而再次导致未定义行为

使用常规分配,让编译器为您正确进行转换:

sizeOfStr = size;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM