Detailed information on abort using macro and new __abort function
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
#ifndef _BITS_STDLIB_H
|
||||
#define _BITS_STDLIB_H
|
||||
|
||||
# define abort() __abort(__func__, __FILE__, __LINE__)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
+5
-3
@@ -1,10 +1,12 @@
|
||||
#include <stdint.h>
|
||||
|
||||
void abort();
|
||||
|
||||
uintptr_t __stack_chk_guard = 0xd048c37519fcadfe;
|
||||
|
||||
// manually define detailed abort function
|
||||
void __abort(const char *func, const char *file, int line);
|
||||
|
||||
__attribute__((noreturn))
|
||||
void __stack_chk_fail(void) {
|
||||
abort();
|
||||
// call detailed abort function
|
||||
__abort(__func__, __FILE__, __LINE__);
|
||||
}
|
||||
|
||||
@@ -3,3 +3,12 @@ double strtod(const char *nptr, char **endptr);
|
||||
long double strtold(const char *nptr, char **endptr) {
|
||||
return (long double)strtod(nptr, endptr);
|
||||
}
|
||||
|
||||
// manually define detailed abort function
|
||||
void __abort(const char *func, const char *file, int line);
|
||||
|
||||
// backup definition of abort for programs that link it directly
|
||||
void abort() {
|
||||
// call detailed abort function
|
||||
__abort(__func__, __FILE__, __LINE__);
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ use crate::{
|
||||
header::{stdio, stdlib},
|
||||
platform::types::*,
|
||||
};
|
||||
use core::fmt::Write;
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn __assert_fail(
|
||||
@@ -18,14 +17,13 @@ pub unsafe extern "C" fn __assert_fail(
|
||||
let file = CStr::from_ptr(file).to_str().unwrap();
|
||||
let cond = CStr::from_ptr(cond).to_str().unwrap();
|
||||
|
||||
writeln!(
|
||||
*stdio::stderr,
|
||||
eprintln!(
|
||||
"{}: {}:{}: Assertion `{}` failed.",
|
||||
func,
|
||||
file,
|
||||
line,
|
||||
cond
|
||||
)
|
||||
.unwrap();
|
||||
stdlib::abort();
|
||||
);
|
||||
|
||||
core::intrinsics::abort();
|
||||
}
|
||||
|
||||
@@ -90,8 +90,21 @@ pub unsafe extern "C" fn a64l(s: *const c_char) -> c_long {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn abort() {
|
||||
eprintln!("abort() called");
|
||||
pub unsafe extern "C" fn __abort(
|
||||
func: *const c_char,
|
||||
file: *const c_char,
|
||||
line: c_int,
|
||||
) {
|
||||
let func = CStr::from_ptr(func).to_str().unwrap();
|
||||
let file = CStr::from_ptr(file).to_str().unwrap();
|
||||
|
||||
eprintln!(
|
||||
"{}: {}:{}: Abort",
|
||||
func,
|
||||
file,
|
||||
line
|
||||
);
|
||||
|
||||
intrinsics::abort();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user