| Current File : //usr/share/man/man3c/stack_violation.3c |
'\" te
.\" Copyright (c) 2002, Sun Microsystems, Inc. All Rights Reserved.
.TH stack_violation 3C "18 Jul 2002" "SunOS 5.11" "Standard C Library Functions"
.SH NAME
stack_violation \- determine stack boundary violation event
.SH SYNOPSIS
.LP
.nf
#include <ucontext.h>
\fBint\fR \fBstack_violation\fR(\fBint\fR \fIsig\fR, \fBconst siginfo_t *\fR\fIsip\fR,
\fBconst ucontext_t *\fR\fIucp\fR);
.fi
.SH DESCRIPTION
.sp
.LP
The \fBstack_violation()\fR function returns a boolean value indicating whether the signal, \fIsig\fR, and accompanying signal information, \fIsip\fR, and saved context, \fIucp\fR, represent a stack boundary violation event or a stack overflow.
.SH RETURN VALUES
.sp
.LP
The \fBstack_violation()\fR function returns 0 if the signal does not represent a stack boundary violation event and 1 if the signal does represent a stack boundary violation event.
.SH ERRORS
.sp
.LP
No errors are defined.
.SH EXAMPLES
.LP
\fBExample 1 \fRSet up a signal handler to run on an alternate stack.
.sp
.LP
The following example sets up a signal handler for \fBSIGSEGV\fR to run on an alternate signal stack. For each signal it handles, the handler emits a message to indicate if the signal was produced due to a stack boundary violation.
.sp
.in +2
.nf
#include <stdlib.h>
#include <unistd.h>
#include <ucontext.h>
#include <signal.h>
static void
handler(int sig, siginfo_t *sip, void *p)
{
ucontext_t *ucp = p;
const char *str;
if (stack_violation(sig, sip, ucp))
str = "stack violation.\en";
else
str = "no stack violation.\en";
(void) write(STDERR_FILENO, str, strlen(str));
exit(1);
}
int
main(int argc, char **argv)
{
struct sigaction sa;
stack_t altstack;
altstack.ss_size = SIGSTKSZ;
altstack.ss_sp = malloc(SIGSTKSZ);
altstack.ss_flags = 0;
(void) sigaltstack(&altstack, NULL);
sa.sa_sigaction = handler;
(void) sigfillset(&sa.sa_mask);
sa.sa_flags = SA_ONSTACK | SA_SIGINFO;
(void) sigaction(SIGSEGV, &sa, NULL);
/*
* The application is now set up to use stack_violation(3C).
*/
return (0);
}
.fi
.in -2
.SH USAGE
.sp
.LP
An application typically uses \fBstack_violation()\fR in a signal handler that has been installed for \fBSIGSEGV\fR using \fBsigaction\fR(2) with the \fBSA_SIGINFO\fR flag set and is configured to run on an alternate signal stack.
.SH ATTRIBUTES
.sp
.LP
See \fBattributes\fR(5) for descriptions of the following attributes:
.sp
.sp
.TS
tab() box;
cw(2.75i) |cw(2.75i)
lw(2.75i) |lw(2.75i)
.
ATTRIBUTE TYPEATTRIBUTE VALUE
_
Interface StabilityCommitted
_
MT-LevelAsync-Signal-Safe
.TE
.SH SEE ALSO
.sp
.LP
\fBsigaction\fR(2), \fBsigaltstack\fR(2), \fBstack_getbounds\fR(3C), \fBstack_inbounds\fR(3C), \fBstack_setbounds\fR(3C), \fBattributes\fR(5)