xref: /third_party/musl/src/exit/linux/assert.c (revision 570af302)
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