• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }