为什么%rax值为0xfffffffffffffffd?

问题描述

我在std::unordered_map的{​​{3}}内有几个C ++代码核心转储。导致核心转储的代码大致如下:

std::unordered_map< std::string,std::vector<std::string> > fields;
fields[key].push_back(value);

我无法在本地机器上复制它,我只有几个核心转储。它们都是由operator[]内部的分段错误引起的。这是反汇编有害代码的一部分:

(gdb) disassemble 
Dump of assembler code for function std::__detail::_Map_base<std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<std::__cxx11::basic_string<char,std::allocator<char> > const,std::vector<std::__cxx11::basic_string<char,std::allocator<std::__cxx11::basic_string<char,std::allocator<char> > > > >,std::allocator<std::pair<std::__cxx11::basic_string<char,std::allocator<char> > > > > >,std::__detail::_Select1st,std::equal_to<std::__cxx11::basic_string<char,std::allocator<char> > >,std::hash<std::__cxx11::basic_string<char,std::__detail::_Mod_range_hashing,std::__detail::_Default_ranged_hash,std::__detail::_Prime_rehash_policy,std::__detail::_Hashtable_traits<true,false,true>,true>::operator[](std::__cxx11::basic_string<char,std::allocator<char> > const&):
   0x000000000043fc70 <+0>: push   %rbp
   0x000000000043fc71 <+1>: mov    $0xc70f6907,%edx
   0x000000000043fc76 <+6>: mov    %rsp,%rbp
   0x000000000043fc79 <+9>: push   %r15
   0x000000000043fc7b <+11>:    push   %r14
   0x000000000043fc7d <+13>:    mov    %rdi,%r14
   0x000000000043fc80 <+16>:    push   %r13
   0x000000000043fc82 <+18>:    push   %r12
   0x000000000043fc84 <+20>:    mov    %rsi,%r12
   0x000000000043fc87 <+23>:    push   %rbx
   0x000000000043fc88 <+24>:    sub    $0x18,%rsp
   0x000000000043fc8c <+28>:    mov    0x8(%rsi),%rsi
   0x000000000043fc90 <+32>:    mov    (%r12),%rdi
   0x000000000043fc94 <+36>:    callq  0x408cd0 <_ZSt11_Hash_bytesPKvmm@plt>
   0x000000000043fc99 <+41>:    mov    0x8(%r14),%rcx
   0x000000000043fc9d <+45>:    xor    %edx,%edx
   0x000000000043fc9f <+47>:    mov    %rax,%r13
   0x000000000043fca2 <+50>:    div    %rcx
   0x000000000043fca5 <+53>:    mov    (%r14),%rax
   0x000000000043fca8 <+56>:    mov    (%rax,%rdx,8),%rax
   0x000000000043fcac <+60>:    mov    %rdx,%r15
   0x000000000043fcaf <+63>:    test   %rax,%rax
   0x000000000043fcb2 <+66>:    je     0x43fd18 <std::__detail::_Map_base<std::__cxx11::basic_string<char,std::allocator<char> > const&)+168>
=> 0x000000000043fcb4 <+68>:    mov    (%rax),%rbx
   0x000000000043fcb7 <+71>:    mov    0x40(%rbx),%rsi

在引用mov寄存器的%rax指令上发生了分段错误:

=> 0x000000000043fcb4 <+68>:    mov    (%rax),%rbx

问题是%rax的值为0xfffffffffffffffd,而mov试图在该地址读取,这导致分段错误:

(gdb) p/x $rax
$1 = 0xfffffffffffffffd

%rax的值最终导致细分错误的原因是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...