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 10static assert_call g_cb = NULL; 11void set_assert_callback(assert_call cb) 12{ 13 g_cb = cb; 14} 15 16void __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} 46