
1: /* Copyright (C) 1991,1994-1996,1998,2001,2002,2005 2: Free Software Foundation, Inc. 3: This file is part of the GNU C Library. 4: 5: The GNU C Library is free software; you can redistribute it and/or 6: modify it under the terms of the GNU Lesser General Public 7: License as published by the Free Software Foundation; either 8: version 2.1 of the License, or (at your option) any later version. 9: 10: The GNU C Library is distributed in the hope that it will be useful, 11: but WITHOUT ANY WARRANTY; without even the implied warranty of 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13: Lesser General Public License for more details. 14: 15: You should have received a copy of the GNU Lesser General Public 16: License along with the GNU C Library; if not, write to the Free 17: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18: 02111-1307 USA. */ 19: 20: #include <assert.h> 21: #include <libintl.h> 22: #include <stdio.h> 23: #include <stdlib.h> 24: #include <sysdep.h> 25: #include <unistd.h> 26: 27: 28: extern const char *__progname; 29: 30: #ifdef USE_IN_LIBIO 31: # include <wchar.h> 32: # include <libio/iolibio.h> 33: # define fflush(s) INTUSE(_IO_fflush) (s) 34: #endif 35: 36: /* This function, when passed a string containing an asserted 37: expression, a filename, and a line number, prints a message 38: on the standard error stream of the form: 39: a.c:10: foobar: Assertion `a == b' failed. 40: It then aborts program execution via a call to `abort'. */ 41: 42: #ifdef FATAL_PREPARE_INCLUDE 43: # include FATAL_PREPARE_INCLUDE 44: #endif 45: 46: #undef __assert_fail 47: void 48: __assert_fail (const char *assertion, const char *file, unsigned int line, 49: const char *function) 50: { 51: char *buf; 52: 53: #ifdef FATAL_PREPARE 54: FATAL_PREPARE; 55: #endif 56: 57: if (__asprintf (&buf, _("%s%s%s:%u: %s%sAssertion `%s' failed.\n"), 58: __progname, __progname[0] ? ": " : "", 59: file, line, 60: function ? function : "", function ? ": " : "", 61: assertion) >= 0) 62: { 63: /* Print the message. */ 64: (void) __fxprintf (NULL, "%s", buf); 65: (void) fflush (stderr); 66: 67: /* We have to free the buffer since the application might catch the 68: SIGABRT. */ 69: free (buf); 70: } 71: else 72: { 73: /* At least print a minimal message. */ 74: static const char errstr[] = "Unexpected error.\n"; 75: __libc_write (STDERR_FILENO, errstr, sizeof (errstr) - 1); 76: } 77: 78: abort (); 79: } 80: hidden_def(__assert_fail)