|
Archives
D Programming
digitalmars.Ddigitalmars.D.bugs digitalmars.D.dtl digitalmars.D.ide digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger D.gnu D C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript electronics |
digitalmars.D.bugs - [Issue 3753] New: ICE eh.c 49: Related to exception handling and alloca.
http://d.puremagic.com/issues/show_bug.cgi?id=3753 Summary: ICE eh.c 49: Related to exception handling and alloca. Product: D Version: 2.039 Platform: Other OS/Version: Linux Status: NEW Keywords: ice-on-valid-code Severity: major Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: dsimcha yahoo.com --- Comment #0 from David Simcha <dsimcha yahoo.com> 2010-01-29 15:04:57 PST --- I can't seem to reduce this one to a small test case, but I think this comment from where the assert fires at least gives a hint that it involves some combination of exceptions and alloca: // BUG: alloca() changes the stack size, which is not reflected // in the fixed eh tables. assert(!usedalloca); Also, in the (too large to post to Bugzilla) program that this issue occurred in, removing the alloca() calls and replacing them with GC.malloc() fixed the problem. This assert is in a #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS statement, so I guess it only happens on those OS's. The code that triggers it definitely works on Windows. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- Jan 29 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3753 Don <clugdbug yahoo.com.au> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |clugdbug yahoo.com.au --- Comment #1 from Don <clugdbug yahoo.com.au> 2010-01-30 00:53:46 PST --- (In reply to comment #0) Jan 30 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3753 --- Comment #2 from David Simcha <dsimcha yahoo.com> 2010-01-30 06:48:29 PST --- import core.stdc.stdlib; void main(string[] args) { try { doNothing(); } catch {} void* foo = alloca(args.length); } void doNothing() {} I've had some more time to fiddle with this and more insight into what causes it, so I've managed to get a reduced test case working. It seems like you need to do both of the following in the same function: 1. Use exception handling either explicitly or implicitly. This can include try-catch, try-finally, scope(exit), and struct destructors. 2. Use alloca, but **the number of bytes must not be a compile-time constant**. This is what was messing me up before. If you replace: void* foo = alloca(args.length); with: void* foo = alloca(8); then this bug will not be triggered. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- Jan 30 2010
|