blob: 9b392252ad5cb71198b14d7c5c61df43889af612 [file] [log] [blame]
/**************************************************************************
*
* assert.cpp - definition of debugging assertion functions
*
* $Id$
*
***************************************************************************
*
* Copyright (c) 1994-2005 Quovadx, Inc., acting through its Rogue Wave
* Software division. Licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0. Unless required by
* applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License
* for the specific language governing permissions and limitations under
* the License.
*
**************************************************************************/
#define _RWSTD_LIB_SRC
#include <stdio.h> // for fprintf()
#include <stdlib.h> // for abort()
#include <rw/_defs.h>
#ifdef __HP_aCC
extern "C" void U_STACK_TRACE ();
# define STACK_TRACE U_STACK_TRACE
#elif defined (__GLIBC__)
# include <execinfo.h>
_RWSTD_NAMESPACE (__rw) {
static void
__rw_stack_trace (int fd)
{
// limit stacktrace to the depth of 256 calls
void* array [256];
const int size = backtrace (array, int (sizeof array / sizeof *array));
backtrace_symbols_fd (array, size, fd);
}
} // namespace __rw
# define STACK_TRACE() _RW::__rw_stack_trace (2)
#elif defined (_RWSTD_OS_SUNOS) \
&& (5 < _RWSTD_OS_MAJOR || 5 == _RWSTD_OS_MAJOR && 8 < _RWSTD_OS_MINOR)
// only Solaris 9 and better defines printstack() (in <ucontext.h>)
// declare the function here instead of including the header to avoid
// having to #define enabling macros (i.e., __EXTENSIONS__) and deal
// with the breakage when using a strict compiler such as EDG eccp
// with the long long extension (used in some system headers) disabled
extern "C" int printstack (int);
# define STACK_TRACE() printstack (2)
#endif
#ifndef STACK_TRACE
# define STACK_TRACE() (void)0
#endif // __HP_aCC
_RWSTD_NAMESPACE (__rw) {
_RWSTD_EXPORT void
__rw_assert_fail (const char *expr,
const char *file, int line, const char *func)
{
// func may be 0 if the compiler doesn't support the ANSI C predefined
// identifier `__func__' (see 6.4.2.2 of ISO/IEC 9899:1999) or an
// equivalent thereof, such as gcc's __PRETTY_FUNCTION__
if (func)
fprintf (stderr, "%s:%d: %s: Assertion '%s' failed.\n",
file, line, func, expr);
else
fprintf (stderr, "%s:%d: Assertion '%s' failed.\n",
file, line, expr);
// print stack trace (if available) before aborting
STACK_TRACE ();
abort ();
}
} // namespace __rw