https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71867
--- Comment #8 from asmwarrior <asmwarrior at gmail dot com> ---
Hi, I just build wx2.8.12 under TDM-GCC 5.1 with
-fno-delete-null-pointer-checks enabled. But the bad thing is that I still see
the same crash here. The whole command is below:
mingw32-make -f makefile.gcc USE_XRC=1 SHARED=1 MONOLITHIC=1 BUILD=release
UNICODE=1 USE_OPENGL=1 VENDOR=cb CXXFLAGS="-Wno-unused-local-typedefs
-Wno-deprecated-declarations -fno-keep-inline-dllexport
-fno-delete-null-pointer-checks -g" >log-release-no-delete-null.txt 2>&1
For some assembler code of the crash:
[debug]Stack level 0, frame at 0x22e004:
[debug] eip = 0x6d11fb05 in wxClassInfo::IsKindOf
(F:\wx\wxMSW-2.8.12\include\wx\object.h:94); saved eip = 0x6cfa043d
[debug] inlined into frame 1
[debug] source language c++.
[debug] Arglist at unknown address.
[debug] Locals at unknown address, Previous frame's sp in esp
[debug]>>>>>>cb_gdb:
[debug]> disassemble 0x6d11fb05
[debug]Dump of assembler code for function wxCheckDynamicCast(wxObject*,
wxClassInfo*):
[debug] 0x6d11fa70 <+0>: push ebp
[debug] 0x6d11fa71 <+1>: push edi
[debug] 0x6d11fa72 <+2>: push esi
[debug] 0x6d11fa73 <+3>: push ebx
[debug] 0x6d11fa74 <+4>: sub esp,0x1c
[debug] 0x6d11fa77 <+7>: mov ebx,DWORD PTR [esp+0x30]
[debug] 0x6d11fa7b <+11>: mov esi,DWORD PTR [esp+0x34]
[debug] 0x6d11fa7f <+15>: test ebx,ebx
[debug] 0x6d11fa81 <+17>: je 0x6d11fb50
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+224>
[debug] 0x6d11fa87 <+23>: mov eax,DWORD PTR [ebx]
[debug] 0x6d11fa89 <+25>: mov ecx,ebx
[debug] 0x6d11fa8b <+27>: call DWORD PTR [eax]
[debug] 0x6d11fa8d <+29>: test esi,esi
[debug] 0x6d11fa8f <+31>: mov edx,eax
[debug] 0x6d11fa91 <+33>: je 0x6d11fb50
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+224>
[debug] 0x6d11fa97 <+39>: cmp eax,esi
[debug] 0x6d11fa99 <+41>: je 0x6d11fb3e
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+206>
[debug] 0x6d11fa9f <+47>: mov edi,DWORD PTR [eax+0xc]
[debug] 0x6d11faa2 <+50>: test edi,edi
[debug] 0x6d11faa4 <+52>: je 0x6d11fb05
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+149>
[debug] 0x6d11faa6 <+54>: cmp esi,edi
[debug] 0x6d11faa8 <+56>: je 0x6d11fb3e
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+206>
[debug] 0x6d11faae <+62>: mov ebp,DWORD PTR [edi+0xc]
[debug] 0x6d11fab1 <+65>: test ebp,ebp
[debug] 0x6d11fab3 <+67>: je 0x6d11faed
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+125>
[debug] 0x6d11fab5 <+69>: cmp esi,ebp
[debug] 0x6d11fab7 <+71>: je 0x6d11fb3e
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+206>
[debug] 0x6d11fabd <+77>: mov ecx,DWORD PTR [ebp+0xc]
[debug] 0x6d11fac0 <+80>: test ecx,ecx
[debug] 0x6d11fac2 <+82>: je 0x6d11fad5
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+101>
[debug] 0x6d11fac4 <+84>: mov DWORD PTR [esp],esi
[debug] 0x6d11fac7 <+87>: call 0x6d166c80
<wxClassInfo::IsKindOf(wxClassInfo const*) const>
[debug] 0x6d11facc <+92>: sub esp,0x4
[debug] 0x6d11facf <+95>: test al,al
[debug] 0x6d11fad1 <+97>: mov ecx,ebx
[debug] 0x6d11fad3 <+99>: jne 0x6d11fb40
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+208>
[debug] 0x6d11fad5 <+101>: mov ecx,DWORD PTR [ebp+0x10]
[debug] 0x6d11fad8 <+104>: test ecx,ecx
[debug] 0x6d11fada <+106>: je 0x6d11faed
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+125>
[debug] 0x6d11fadc <+108>: mov DWORD PTR [esp],esi
[debug] 0x6d11fadf <+111>: call 0x6d166c80
<wxClassInfo::IsKindOf(wxClassInfo const*) const>
[debug] 0x6d11fae4 <+116>: sub esp,0x4
[debug] 0x6d11fae7 <+119>: test al,al
[debug] 0x6d11fae9 <+121>: mov ecx,ebx
[debug] 0x6d11faeb <+123>: jne 0x6d11fb40
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+208>
[debug] 0x6d11faed <+125>: mov ecx,DWORD PTR [edi+0x10]
[debug] 0x6d11faf0 <+128>: test ecx,ecx
[debug] 0x6d11faf2 <+130>: je 0x6d11fb05
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+149>
[debug] 0x6d11faf4 <+132>: mov DWORD PTR [esp],esi
[debug] 0x6d11faf7 <+135>: call 0x6d166c80
<wxClassInfo::IsKindOf(wxClassInfo const*) const>
[debug] 0x6d11fafc <+140>: sub esp,0x4
[debug] 0x6d11faff <+143>: test al,al
[debug] 0x6d11fb01 <+145>: mov ecx,ebx
[debug] 0x6d11fb03 <+147>: jne 0x6d11fb40
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+208>
[debug]=> 0x6d11fb05 <+149>: mov edx,DWORD PTR [edx+0x10]
[debug] 0x6d11fb08 <+152>: test edx,edx
[debug] 0x6d11fb0a <+154>: je 0x6d11fb50
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+224>
[debug] 0x6d11fb0c <+156>: cmp esi,edx
[debug] 0x6d11fb0e <+158>: je 0x6d11fb3e
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+206>
[debug] 0x6d11fb10 <+160>: mov ecx,DWORD PTR [edx+0xc]
[debug] 0x6d11fb13 <+163>: test ecx,ecx
[debug] 0x6d11fb15 <+165>: je 0x6d11fb28
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+184>
[debug] 0x6d11fb17 <+167>: mov DWORD PTR [esp],esi
[debug] 0x6d11fb1a <+170>: call 0x6d166c80
<wxClassInfo::IsKindOf(wxClassInfo const*) const>
[debug] 0x6d11fb1f <+175>: sub esp,0x4
[debug] 0x6d11fb22 <+178>: test al,al
[debug] 0x6d11fb24 <+180>: mov ecx,ebx
[debug] 0x6d11fb26 <+182>: jne 0x6d11fb40
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+208>
[debug] 0x6d11fb28 <+184>: mov ecx,DWORD PTR [edx+0x10]
[debug] 0x6d11fb2b <+187>: test ecx,ecx
[debug] 0x6d11fb2d <+189>: je 0x6d11fb50
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+224>
[debug] 0x6d11fb2f <+191>: mov DWORD PTR [esp],esi
[debug] 0x6d11fb32 <+194>: call 0x6d166c80
<wxClassInfo::IsKindOf(wxClassInfo const*) const>
[debug] 0x6d11fb37 <+199>: sub esp,0x4
[debug] 0x6d11fb3a <+202>: test al,al
[debug] 0x6d11fb3c <+204>: je 0x6d11fb50
<wxCheckDynamicCast(wxObject*, wxClassInfo*)+224>
[debug] 0x6d11fb3e <+206>: mov ecx,ebx
[debug] 0x6d11fb40 <+208>: add esp,0x1c
[debug] 0x6d11fb43 <+211>: mov eax,ecx
[debug] 0x6d11fb45 <+213>: pop ebx
[debug] 0x6d11fb46 <+214>: pop esi
[debug] 0x6d11fb47 <+215>: pop edi
[debug] 0x6d11fb48 <+216>: pop ebp
[debug] 0x6d11fb49 <+217>: ret
[debug] 0x6d11fb4a <+218>: lea esi,[esi+0x0]
[debug] 0x6d11fb50 <+224>: add esp,0x1c
[debug] 0x6d11fb53 <+227>: xor ecx,ecx
[debug] 0x6d11fb55 <+229>: pop ebx
[debug] 0x6d11fb56 <+230>: mov eax,ecx
[debug] 0x6d11fb58 <+232>: pop esi
[debug] 0x6d11fb59 <+233>: pop edi
[debug] 0x6d11fb5a <+234>: pop ebp
[debug] 0x6d11fb5b <+235>: ret
[debug]End of assembler dump.
[debug]>>>>>>cb_gdb:
Do you see the pointer is not checked?
The code is in object.h (in wxWidgets's 2.8.12 source code)
// ----------------------------------------------------------------------------
// wxClassInfo
// ----------------------------------------------------------------------------
typedef wxObject *(*wxObjectConstructorFn)(void);
class WXDLLIMPEXP_BASE wxClassInfo
{
public:
wxClassInfo( const wxChar *className,
const wxClassInfo *baseInfo1,
const wxClassInfo *baseInfo2,
int size,
wxObjectConstructorFn ctor )
: m_className(className)
, m_objectSize(size)
, m_objectConstructor(ctor)
, m_baseInfo1(baseInfo1)
, m_baseInfo2(baseInfo2)
, m_next(sm_first)
{
sm_first = this;
Register();
}
~wxClassInfo();
wxObject *CreateObject() const
{ return m_objectConstructor ? (*m_objectConstructor)() : 0; }
bool IsDynamic() const { return (NULL != m_objectConstructor); }
const wxChar *GetClassName() const { return m_className; }
const wxChar *GetBaseClassName1() const
{ return m_baseInfo1 ? m_baseInfo1->GetClassName() : NULL; }
const wxChar *GetBaseClassName2() const
{ return m_baseInfo2 ? m_baseInfo2->GetClassName() : NULL; }
const wxClassInfo *GetBaseClass1() const { return m_baseInfo1; }
const wxClassInfo *GetBaseClass2() const { return m_baseInfo2; }
int GetSize() const { return m_objectSize; }
wxObjectConstructorFn GetConstructor() const
{ return m_objectConstructor; }
static const wxClassInfo *GetFirst() { return sm_first; }
const wxClassInfo *GetNext() const { return m_next; }
static wxClassInfo *FindClass(const wxChar *className);
// Climb upwards through inheritance hierarchy.
// Dual inheritance is catered for.
bool IsKindOf(const wxClassInfo *info) const
{
return info != 0 &&
( info == this ||
( m_baseInfo1 && m_baseInfo1->IsKindOf(info) ) ||
( m_baseInfo2 && m_baseInfo2->IsKindOf(info) ) );
}