[Issue 904] New: Bad code generated for local _assert routine
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Jan 29 11:08:48 PST 2007
http://d.puremagic.com/issues/show_bug.cgi?id=904
Summary: Bad code generated for local _assert routine
Product: D
Version: 1.00
Platform: PC
OS/Version: Windows
Status: NEW
Keywords: wrong-code
Severity: normal
Priority: P2
Component: DMD
AssignedTo: bugzilla at digitalmars.com
ReportedBy: sean at f4.ca
Given the code:
extern (C) void _d_assert( char[] file, uint line );
void call_assert( char[] file, uint line )
{
_d_assert( file, line );
}
void main()
{
call_assert( "a", 1 );
assert( false );
}
The code generation for call_assert and the automatically generated _assert
routine should be identical, but they aren't:
_D4test11call_assertFAakZv comdat
assume CS:_D4test11call_assertFAakZv
L0: push EAX
push dword ptr 0Ch[ESP]
push dword ptr 0Ch[ESP]
call near ptr __d_assert
add ESP,0Ch
ret 8
_D4test11call_assertFAakZv ends
_D4test8__assertFiZv comdat
assume CS:_D4test8__assertFiZv
L0: push EAX
push dword ptr FLAT:_DATA[01Ch]
push dword ptr FLAT:_DATA[018h]
call near ptr __d_assert
ret
_D4test8__assertFiZv ends
You'll notice that the implicitly generated _assert routine doesn't clean up
its stack on exit. This is fine for the normal case where an exception is
thrown from assert(), but any attempt to override _d_assert to behave otherwise
will resunt in an access violation.
--
More information about the Digitalmars-d-bugs
mailing list