1 /* $NetBSD: assertions.c,v 1.6 2014/12/10 04:37:59 christos Exp $ */
4 * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC")
5 * Copyright (C) 1997-2001 Internet Software Consortium.
7 * Permission to use, copy, modify, and/or distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
20 /* Id: assertions.c,v 1.26 2009/09/29 15:06:07 fdupont Exp */
29 #include <isc/assertions.h>
30 #include <isc/backtrace.h>
32 #include <isc/result.h>
35 * The maximum number of stack frames to dump on assertion failure.
37 #ifndef BACKTRACE_MAXFRAME
38 #define BACKTRACE_MAXFRAME 128
45 default_callback(const char *, int, isc_assertiontype_t
, const char *);
47 static isc_assertioncallback_t isc_assertion_failed_cb
= default_callback
;
53 /*% assertion failed handler */
56 isc_assertion_failed(const char *file
, int line
, isc_assertiontype_t type
,
59 isc_assertion_failed_cb(file
, line
, type
, cond
);
66 isc_assertion_setcallback(isc_assertioncallback_t cb
) {
68 isc_assertion_failed_cb
= default_callback
;
70 isc_assertion_failed_cb
= cb
;
75 isc_assertion_typetotext(isc_assertiontype_t type
) {
79 * These strings have purposefully not been internationalized
80 * because they are considered to essentially be keywords of
81 * the ISC development environment.
84 case isc_assertiontype_require
:
87 case isc_assertiontype_ensure
:
90 case isc_assertiontype_insist
:
93 case isc_assertiontype_invariant
:
106 /* coverity[+kill] */
108 default_callback(const char *file
, int line
, isc_assertiontype_t type
,
111 void *tracebuf
[BACKTRACE_MAXFRAME
];
113 const char *logsuffix
= ".";
117 result
= isc_backtrace_gettrace(tracebuf
, BACKTRACE_MAXFRAME
, &nframes
);
118 if (result
== ISC_R_SUCCESS
&& nframes
> 0)
119 logsuffix
= ", back trace";
121 fprintf(stderr
, "%s:%d: %s(%s) %s%s\n",
122 file
, line
, isc_assertion_typetotext(type
), cond
,
123 isc_msgcat_get(isc_msgcat
, ISC_MSGSET_GENERAL
,
124 ISC_MSG_FAILED
, "failed"), logsuffix
);
125 if (result
== ISC_R_SUCCESS
) {
126 for (i
= 0; i
< nframes
; i
++) {
127 unsigned long offset
;
130 result
= isc_backtrace_getsymbol(tracebuf
[i
], &fname
,
132 if (result
== ISC_R_SUCCESS
) {
133 fprintf(stderr
, "#%d %p in %s()+0x%lx\n", i
,
134 tracebuf
[i
], fname
, offset
);
136 fprintf(stderr
, "#%d %p in ??\n", i
,