[Issue 5517] SEGV: assert(false) in release mode

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Mar 6 04:52:30 PST 2011


http://d.puremagic.com/issues/show_bug.cgi?id=5517



--- Comment #5 from Iain Buclaw <ibuclaw at ubuntu.com> 2011-03-06 04:49:31 PST ---
(In reply to comment #4)
> (In reply to comment #3)
> > (In reply to comment #2)
> > > Some further detail: 0xF4, the HLT opcode, is a privileged instruction; it
> > > doesn't actually get executed. Instead, a Privileged Instruction hardware
> > > exception is raised. I would expect Linux to turn this into SIGILL. So I would
> > > expect an exit code of 132, if nothing is done to process it. There is no way
> > > it should give a SEGV.
> > >
> > 
> > If I was going off what I recall, I would have said that when a program
> > receives the hlt instruction; it just stops executing instructions until there
> > is an interrupt (in other words it just floats off in an undefined space).
> 
> That's what it does in ring 0 (ie, inside the kernel). But outside the kernel,
> it's a privileged instruction, which generates a hardware 'illegal instruction'
> interrupt.
> 
> 
> > But I've looked it up, and HLT invokes SIGSEGV signal afterall...
> 
> Wow. Then Linux is just wrong. It should definitely be SIGILL. There's no
> memory access violation.
> 

Well, signals are != exceptions. :)

> > > On Windows, druntime checks the offending instruction, and if it is HLT, it is
> > > identified as a runtime assert(0).
> > 
> > So on Windows, the runtime has a bespoke signal handler?
> 
> Everything you'd call a signal on Linux, is just a system exception on Windows.
> D's exception handling uses the exact same mechanism. 
> On all platforms, main is surrounded by a catch(...) which displays error
> messages from any uncaught exceptions.
> On Windows, this includes hardware faults as well as D-generated exceptions.
> 
> The impression I get from the little I know of Unix signal handling, it seems
> to be one of the few things that Unix got horribly wrong. Windows structured
> exception handling is brilliant (albeit almost completely undocumented!) I am
> extremely impressed with it. For example, there's no restrictions on what you
> can do inside an exception handler.
> So there's probably more challenges for the *nix implementation of a lot of
> this stuff.

There are 2 alternatives I can think of instead of using 'hlt'

1) Throw an exception (goes against release mode).

2) Raise an alternate interrupt. Like 'hlt', these are single byte opcodes.

- int 0x3;  #BP will invoke SIGTRAP signal handler.
- ud2;      #UD will invoke SIGILL signal handler.

Regards

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list