1

最近、大きな C++(MFC) ソリューションを VS2010 から VS2012 に変換しました。そして、リリース構成でアプリがクラッシュしました。いくつかの調査の後、クラッシュにつながる行を見つけました。次のような機能です。

void CMyWnd::Foo()
{
     if (!m_sub_wnd.GetSafeHwnd())
         return;

     // some other code goes here
     // here used m_sub_wnd and another member m_data
}

リリース モードの disasm では、最初の条件として次のコードが表示されます。

if (!m_sub_wnd.GetSafeHwnd())
00000001405F6E30  add         rcx,260h  
00000001405F6E37  je          CMyWnd::Foo+0DBh  (01405F6F0Bh)  
00000001405F6E3D  push        rsi  
00000001405F6E3E  sub         rsp,30h  
00000001405F6E42  cmp         qword ptr [rcx+40h],0  
00000001405F6E47  mov         rsi,rcx  
00000001405F6E4A  je          CMyWnd::Foo+0D6h (01405F6F06h)  
return;

「add rcx,260h」はどのような場合でもこのポインターを変更し、他のコードがこのポインターを破損しているようです。私はasmに精通していません。それは正しいですか、それとも何かを逃しましたか?C++ コンパイラのバグと思われる場合は、Microsoft サポートに問題を報告します。

アップデート:

「this」ポインターの関数ダンプに追加すると、クラッシュが消えました。

void CMyWnd::Foo()
{
00000001405F6BE0  mov         qword ptr [rsp+20h],rbx  
00000001405F6BE5  push        rsi  
00000001405F6BE6  sub         rsp,30h  
    if (!m_sub_wnd.GetSafeHwnd())
00000001405F6BEA  lea         rbx,[rcx+260h]  
00000001405F6BF1  mov         rsi,rcx  
00000001405F6BF4  test        rbx,rbx  
00000001405F6BF7  je          CMyWnd::Foo+101h (01405F6CE1h)  
00000001405F6BFD  cmp         qword ptr [rbx+40h],0  
00000001405F6C02  je          CMyWnd::Foo+101h (01405F6CE1h)  
        return;

    s << this << endl;
00000001405F6C08  mov         rdx,rcx  
00000001405F6C0B  lea         rcx,[s (0140D16320h)]  
00000001405F6C12  mov         qword ptr [this],rbp  
00000001405F6C17  mov         qword ptr [rsp+50h],r14  
00000001405F6C1C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (01409325A0h)]  
00000001405F6C22  mov         rdx,qword ptr [__imp_std::endl (01409326D8h)]  
00000001405F6C29  mov         rcx,rax  
00000001405F6C2C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0140932700h)]  
4

0 に答える 0