最近、大きな 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)]