diff options
Diffstat (limited to 'assert/assert.c')
-rw-r--r-- | assert/assert.c | 64 |
1 files changed, 44 insertions, 20 deletions
diff --git a/assert/assert.c b/assert/assert.c index c29629f..d21d76f 100644 --- a/assert/assert.c +++ b/assert/assert.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2024 Free Software Foundation, Inc. +/* Copyright (C) 1991-2025 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -15,22 +15,18 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ -#include <assert.h> -#include <atomic.h> +#include <intprops.h> #include <ldsodefs.h> +#include <libc-pointer-arith.h> #include <libintl.h> -#include <stdio.h> -#include <stdlib.h> -#include <sysdep.h> -#include <unistd.h> -#include <sys/mman.h> +#include <libio/iolibio.h> #include <setvmaname.h> +#include <sys/uio.h> +#include <unistd.h> extern const char *__progname; -#include <wchar.h> -#include <libio/iolibio.h> #define fflush(s) _IO_fflush (s) /* This function, when passed a string containing an asserted @@ -54,18 +50,19 @@ __assert_fail_base (const char *fmt, const char *assertion, const char *file, FATAL_PREPARE; #endif - int total; - if (__asprintf (&str, fmt, - __progname, __progname[0] ? ": " : "", - file, line, - function ? function : "", function ? ": " : "", - assertion, &total) >= 0) + int total = __asprintf (&str, fmt, + __progname, __progname[0] ? ": " : "", + file, line, + function ? function : "", function ? ": " : "", + assertion); + if (total >= 0) { /* Print the message. */ (void) __fxprintf (NULL, "%s", str); (void) fflush (stderr); - total = (total + 1 + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1); + total = ALIGN_UP (total + sizeof (struct abort_msg_s) + 1, + GLRO(dl_pagesize)); struct abort_msg_s *buf = __mmap (NULL, total, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); if (__glibc_likely (buf != MAP_FAILED)) @@ -87,8 +84,35 @@ __assert_fail_base (const char *fmt, const char *assertion, const char *file, else { /* At least print a minimal message. */ - static const char errstr[] = "Unexpected error.\n"; - __libc_write (STDERR_FILENO, errstr, sizeof (errstr) - 1); + char linebuf[INT_STRLEN_BOUND (int) + sizeof ":: "]; + struct iovec v[9]; + int i = 0; + +#define WS(s) (v[i].iov_len = strlen (v[i].iov_base = (void *) (s)), i++) + + if (__progname) + { + WS (__progname); + WS (": "); + } + + WS (file); + v[i++] = (struct iovec) {.iov_base = linebuf, + .iov_len = sprintf (linebuf, ":%d: ", line)}; + + if (function) + { + WS (function); + WS (": "); + } + + WS ("Assertion `"); + WS (assertion); + /* We omit the '.' here so that the assert tests can tell when + this code path is taken. */ + WS ("' failed\n"); + + (void) __writev (STDERR_FILENO, v, i); } abort (); @@ -100,6 +124,6 @@ void __assert_fail (const char *assertion, const char *file, unsigned int line, const char *function) { - __assert_fail_base (_("%s%s%s:%u: %s%sAssertion `%s' failed.\n%n"), + __assert_fail_base (_("%s%s%s:%u: %s%sAssertion `%s' failed.\n"), assertion, file, line, function); } |