shared_ptr null check,这个条件可以让null shared_ptr通过吗?

时间:2018-04-26 11:57:38

标签: c++ null shared-ptr disassembly

我正在调查由以下代码引起的转储:

shared_ptr<Type_Definition> entry = function_result();

if (entry != nullptr) {
  if (launch_other_function(entry, value, timestamp)) { // <= here it crashes
    ...

将三个变量放入Watch窗口时(将光标放在崩溃线上),我看到:

  • timestampvalue
  • 的有效值
  • for entryCannot obtain value of the local variable or argument because it is not available at this instruction pointer, possibly because it has been optimized away.

我相信function_result()会给出一个空指针,null-pointer检查entry无法识别它,让它通过,从而导致访问冲突(为了您的信息,异常消息指出Access violation executing location 0x00000000.)。

我的问题不是:如何检查空指针(我知道可以使用if (entry)完成),但是:我是否正确,此检查可能允许±nullish shared pointer(对不起) ,我不知道如何正确地制定它来通过这个条件?

有人有想法吗?

供您参考:特此声明launch_other_function()

bool launch_other_function(const shared_ptr<Type_Definition>& entry, double value, DATE timestamp){
...
}

在Disassembly窗口中,我看到以下几行代码(我希望它有意义):

0127AA32 85 C0                test        eax,eax  
0127AA34 0F 84 3C 01 00 00    je          0127AB76  
0127AA3A 8B 8D 9C FE FF FF    mov         ecx,dword ptr [ebp-164h]  
0127AA40 FF 15 E4 AF 31 00    call        dword ptr ds:[31AFE4h]  
0127AA46 85 C0                test        eax,eax  
0127AA48 0F 84 AC 00 00 00    je          0127AAFA  
0127AA4E 8B 85 9C FE FF FF    mov         eax,dword ptr [ebp-164h]  
0127AA54 8B B8 80 00 00 00    mov         edi,dword ptr [eax+80h]  
0127AA5A DD 45 0C             fld         qword ptr [ebp+0Ch]  
0127AA5D 83 EC 08             sub         esp,8  
0127AA60 DD 1C 24             fstp        qword ptr [esp]  
0127AA63 C7 85 8C FE FF FF 78 15 4C 00 mov         dword ptr [ebp-174h],4C1578h  
0127AA6D 89 A5 90 FE FF FF    mov         dword ptr [ebp-170h],esp  
0127AA73 C7 85 94 FE FF FF 87 AA 27 01 mov         dword ptr [ebp-16Ch],127AA87h  
0127AA7D C6 46 08 00          mov         byte ptr [esi+8],0  
0127AA81 FF 15 74 17 4C 00    call        dword ptr ds:[4C1774h]  
0127AA87 83 C4 08             add         esp,8  
0127AA8A C6 46 08 01          mov         byte ptr [esi+8],1  
0127AA8E 83 3D 40 D0 01 69 00 cmp         dword ptr ds:[6901D040h],0  
0127AA95 74 09                je          0127AAA0  
0127AA97 50                   push        eax  
0127AA98 52                   push        edx  
0127AA99 E8 82 D9 8B 67       call        68B38420  
0127AA9E 5A                   pop         edx  
0127AA9F 58                   pop         eax  

哦,我忘记了:多线程的程序确实。

关于添加调试信息,我担心添加的内容不多,我可以在以下modules标签的摘录中看到(对于这两种情况(我猜,管理本地人)代码),符号已加载):

<Product_Name>.exe  <Product_Name>.exe  C:\<Product_Name>.exe   N/A Yes Symbols loaded. C:\Dump_Analyse\<Product_Name>.pdb\5BEA8C97EB644ED2B06B9AFE450EF23E1\<Product_Name>.pdb 2   9.05.1638.3292  25/10/2017 15:02    01050000-011DC000   <Product_Name>.exe_180423_041510.dmp        
<Product_Name>.exe  <Product_Name>.exe  C:\<Product_Name>.exe   Yes No  Symbols loaded. C:\Dump_Analyse\<Product_Name>.pdb\5BEA8C97EB644ED2B06B9AFE450EF23E1\<Product_Name>.pdb 14  9.05.1638.3292  25/10/2017 15:02    01050000-011DC000   <Product_Name>.exe_180423_041510.dmp    [1] <Product_Name>.exe  

提前致谢

0 个答案:

没有答案