From 2d19c2d8f2a9d759ecfa73d07ed1bab66f8ac24f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 8 Apr 2010 18:15:30 -0700 Subject: runtime: turn divide by zero, nil dereference into panics tested on linux/amd64, linux/386, linux/arm, darwin/amd64, darwin/386. freebsd untested; will finish in a separate CL. for now all the panics are errorStrings. richer structures can be added as necessary once the mechanism is shaked out. R=r CC=golang-dev http://codereview.appspot.com/906041 --- src/pkg/runtime/darwin/thread.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/pkg/runtime/darwin/thread.c') diff --git a/src/pkg/runtime/darwin/thread.c b/src/pkg/runtime/darwin/thread.c index 38e3c23fb..d9acfa8d3 100644 --- a/src/pkg/runtime/darwin/thread.c +++ b/src/pkg/runtime/darwin/thread.c @@ -6,6 +6,8 @@ #include "defs.h" #include "os.h" +extern SigTab sigtab[]; + static void unimplemented(int8 *name) { @@ -443,3 +445,26 @@ mach_semrelease(uint32 sem) } } +void +sigpanic(void) +{ + switch(g->sig) { + case SIGBUS: + if(g->sigcode0 == BUS_ADRERR && g->sigcode1 < 0x1000) + panicstring("invalid memory address or nil pointer dereference"); + break; + case SIGSEGV: + if((g->sigcode0 == 0 || g->sigcode0 == SEGV_MAPERR) && g->sigcode1 < 0x1000) + panicstring("invalid memory address or nil pointer dereference"); + break; + case SIGFPE: + switch(g->sigcode0) { + case FPE_INTDIV: + panicstring("integer divide by zero"); + case FPE_INTOVF: + panicstring("integer overflow"); + } + panicstring("floating point error"); + } + panicstring(sigtab[g->sig].name); +} -- cgit v1.2.3