2
0
Эх сурвалжийг харах

Detailed information on abort using macro and new __abort function

Jeremy Soller 2 жил өмнө
parent
commit
47bd55451f

+ 2 - 0
include/bits/stdlib.h

@@ -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
src/c/stack_chk.c

@@ -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__);
 }

+ 9 - 0
src/c/stdlib.c

@@ -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__);
+}

+ 4 - 6
src/header/assert/mod.rs

@@ -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();
 }

+ 15 - 2
src/header/stdlib/mod.rs

@@ -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();
 }