1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <info/fatal_message.h>
5 #include <stddef.h>
6 #include <signal.h>
7 #include "musl_log.h"
8 #define ASSERT_FATAL_MESSAGE_SIZE 1024
9
10 static assert_call g_cb = NULL;
set_assert_callback(assert_call cb)11 void set_assert_callback(assert_call cb)
12 {
13 g_cb = cb;
14 }
15
__assert_fail(const char * expr,const char * file,int line,const char * func)16 void __assert_fail(const char *expr, const char *file, int line, const char *func)
17 {
18 // Concatenate information for assert failures and save the final result in assert_fatal_message
19 char assert_fatal_message[ASSERT_FATAL_MESSAGE_SIZE];
20
21 snprintf(assert_fatal_message, sizeof(assert_fatal_message),
22 "Assertion failed: %s (%s: %s: %d)", expr, file, func, line);
23
24 // call set_fatal_message to set assert_fatal_message
25 set_fatal_message(assert_fatal_message);
26 AssertFailureInfo assert_fail = {
27 expr, file, func, line
28 };
29
30 Assert_Status assert_status = ASSERT_ABORT;
31 if (g_cb) {
32 assert_status = g_cb(assert_fail);
33 }
34 if (assert_status == ASSERT_RETRY) {
35 MUSL_LOGE("CallbackFunction return ASSERT_RETRY:\n");
36 raise(SIGUSR1);
37 } else if (assert_status == ASSERT_IGNORE) {
38 MUSL_LOGE("CallbackFunction return ASSERT_IGNORE:\n");
39 return;
40 } else {
41 MUSL_LOGE("CallbackFunction return ASSERT_ABORT:\n");
42 fprintf(stderr, "%s\n", assert_fatal_message);
43 abort();
44 }
45 }