LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
abort.c 文件参考
#include "../../include/lammp/lmmp.h"
#include <stdatomic.h>
#include <stdio.h>
#include <stdlib.h>
+ abort.c 的引用(Include)关系图:

浏览源代码.

函数

void lmmp_abort (lmmp_error_t type, const char *msg, const char *func, int line)
 LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。
 
lmmp_abort_fn lmmp_set_abort_fn (lmmp_abort_fn func)
 设置 LAMMP 全局退出函数(所有线程均生效)
 
static const char * type_to_str (lmmp_error_t type)
 

变量

static atomic_uintptr_t lmmp_abort_func
 

函数说明

◆ lmmp_abort()

void lmmp_abort ( lmmp_error_t  type,
const char *  msg,
const char *  func,
int  line 
)

LAMMP 全局退出函数,内部错误或断言失败时调用,若设置了全局退出函数,则会调用该函数,否则会调用默认的退出函数。

参数
msg退出信息,assert类型的错误信息通常仅包含断言内容,其他类型的错误则因类型不同而不同。
func退出处的函数名
line退出处的行号
type退出类型。有以下几个类型:
   1. ASSERT_FAILURE (枚举值为1)为lmmp_assert触发的退出,lmmp_assert触发的普通退出几乎不可能发生,
        其通常代表不可能发生的计算错误,可能表明程序执行此处时必须正确的输入错误。比如预期无进位的加法产生了进位。
        此类错误不可接受,会导致计算无法继续进行,导致程序崩溃。

   2. DEBUG_ASSERT_FAILURE (枚举值为2)为lmmp_debug_assert触发的退出,其通常表明预期之外的错误,
        这通常是调用者的UB,如无UB的情况下触发此错误;也可能是LAMMP内部的逻辑错误,开发者期待的输入错误,
        在该逻辑处仅简单考虑了某些情况。如有此类错误,可以报告给开发者。此类型只会在定义了 
        LAMMP_DEBUG_ASSERT_CHECK 宏为 1 的情况下才会触发。

   3. PARAM_ASSERT_FAILURE (枚举值为3)为参数检查失败导致的退出,其通常表明调用者传入了无效的参数,
        导致函数的行为不符合预期。此类错误不可接受,会导致计算无法继续进行,导致程序崩溃。此类型的错误只有在
        定义了 LAMMP_DEBUG_PARAM_ASSERT_CHECK 宏为 1 的情况下才会触发。

   4. MEMORY_ALLOC_FAILURE (枚举值为4)为内存分配失败退出,这可能有两种情况:一种情况为分配了堆内存不足,
        导致程序崩溃;另一种情况为栈分配器的栈溢出(栈空间不足或其他UB),其中,情况一是会永远进行的,而情况二
        只有在定义了 LAMMP_DEBUG_STACK_OVERFLOW_CHECK 宏为 1 的情况下才会触发。

   5. MEMORY_FREE_FAILURE (枚举值为5)为内存释放错误,此错误有两种触发可能,一种为堆内存分配释放时,头部信息被损坏
        可能源于传入错误的指针,或缓冲区溢出导致此头部损坏。另一种情况为类似的,由栈分配器分配的内存释放时,头部信息损坏
        或指针不在栈的范围内,导致释放错误,如不是传入错误指针,则可能为栈分配的前一次内存缓冲区溢出,导致此内存释放时,
        头部信息损坏,导致释放无法进行。此类错误错误触发情况较为复杂,LAMMP_DEBUG_MEMORY_CHECK 宏为 1 时,两种情况都
        有可能发生,仅定义 LAMMP_DEBUG_STACK_OVERFLOW_CHECK 宏为 1 时,此错误仅可能由栈分配器触发。

   6. OUT_OF_BOUNDS (枚举值为6)为数组越界访问导致的退出,通常表明未按规定使用空间。此类型的错误在堆栈分配器中,
        均可能触发,但由于栈分配器的特殊性,可能部分越界访问可能被判定为栈溢出,或内存释放错误。具体可尝试查看错误信息。
        此类型只会在定义了 LAMMP_DEBUG_MEMORY_CHECK 宏为 1 的情况下才会触发,Release 模式下通常为 0 。

   7. MEMORY_LEAK (枚举值为7)为内存泄漏导致的退出,有两种情况,一种情况为堆内存计数器不为0,另一种情况为当前栈帧
        不在栈底。此类型的错误需定义 LAMMP_DEBUG_MEMORY_MEMORY_LEAK 宏为 1,才会触发。通常情况下,此错误需要手动调用
        lmmp_leak_tracker宏进行检查。但在调用堆分配器重置时,将会显式检查此时的堆计数器是否为0;在进行栈重置时,会显式检
        查栈是否为空,若不满足,触发此错误。特别注意,当手动调用检查宏时,在某些情况下,可能会进行一些全局堆资源的初始化,
        但未释放,如想正确计数,请先调用 lmmp_global_deinit 进行全局共享的堆资源的安全释放。

   8. UNEXPECTED_ERROR (枚举值为8)为其他未知错误导致的退出。
警告
LAMMP内部中断都将会调用此函数,如果全局退出函数为NULL,则使用默认的退出函数,会打印出全部错误信息,并调用 abort 函数中断程序。自定义全局退出函数请通过 lmmp_set_abort_fn 函数进行设置。请不要在全局退出函数里做任 何危险的操作,本库的开发者不对其调用产生的影响做任何保证。

在文件 abort.c42 行定义.

42 {
43 uintptr_t curr = atomic_load(&lmmp_abort_func);
45 if (fn != NULL) {
46 fn(type, msg, func, line);
47 } else {
48 fprintf(stderr, "LAMMP abort at [%s]:%d\n", func, line);
49 fprintf(stderr, "Abort type: %s, abort msg: \n%s\n", type_to_str(type), msg);
50 fflush(stderr);
51 abort();
52 }
53}
static const char * type_to_str(lmmp_error_t type)
Definition abort.c:19
static atomic_uintptr_t lmmp_abort_func
Definition abort.c:12
void(* lmmp_abort_fn)(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数指针类型
Definition lmmp.h:150

引用了 lmmp_abort_func , 以及 type_to_str().

被这些函数引用 check_extra_memory_overflow(), check_memory_block_integrity(), lmmp_alloc_debug(), lmmp_chech_memory(), lmmp_leak_tracker(), lmmp_set_heap_allocator(), lmmp_stack_alloc(), lmmp_stack_free(), lmmp_stack_reset() , 以及 lmmp_temp_stack_alloc_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_set_abort_fn()

lmmp_abort_fn lmmp_set_abort_fn ( lmmp_abort_fn  func)

设置 LAMMP 全局退出函数(所有线程均生效)

参数
func退出函数指针,可以为NULL
警告
请注意,我们将不会对 func 的调用做任何保护,因此请不要在 func 里做任何危险的操作, 本库的开发者不对 func 函数的调用产生的影响做任何保证。
注解
若 func 为 NULL,则代表使用默认的退出机制。同时,此函数指针是全局的,所有线程共享。
返回
返回之前的退出函数指针,若原指针为NULL,则返回NULL。

在文件 abort.c14 行定义.

14 {
15 uintptr_t old = atomic_exchange(&lmmp_abort_func, (uintptr_t)func);
16 return (lmmp_abort_fn)old;
17}

引用了 lmmp_abort_func.

◆ type_to_str()

static const char * type_to_str ( lmmp_error_t  type)
static

在文件 abort.c19 行定义.

19 {
20 switch (type) {
22 return "ASSERT_FAILURE";
24 return "DEBUG_ASSERT_FAILURE";
26 return "PARAM_ASSERT_FAILURE";
28 return "MEMORY_ALLOC_FAILURE";
30 return "MEMORY_FREE_FAILURE";
32 return "OUT_OF_BOUNDS";
34 return "MEMORY_LEAK";
36 return "UNEXPECTED_ERROR";
37 default:
38 return "UNKNOWN_TYPE";
39 }
40}
@ LAMMP_ERROR_MEMORY_ALLOC_FAILURE
Definition lmmp.h:136
@ LAMMP_ERROR_DEBUG_ASSERT_FAILURE
Definition lmmp.h:134
@ LAMMP_ERROR_UNEXPECTED_ERROR
Definition lmmp.h:140
@ LAMMP_ERROR_MEMORY_LEAK
Definition lmmp.h:139
@ LAMMP_ERROR_ASSERT_FAILURE
Definition lmmp.h:133
@ LAMMP_ERROR_PARAM_ASSERT_FAILURE
Definition lmmp.h:135
@ LAMMP_ERROR_MEMORY_FREE_FAILURE
Definition lmmp.h:137
@ LAMMP_ERROR_OUT_OF_BOUNDS
Definition lmmp.h:138

引用了 LAMMP_ERROR_ASSERT_FAILURE, LAMMP_ERROR_DEBUG_ASSERT_FAILURE, LAMMP_ERROR_MEMORY_ALLOC_FAILURE, LAMMP_ERROR_MEMORY_FREE_FAILURE, LAMMP_ERROR_MEMORY_LEAK, LAMMP_ERROR_OUT_OF_BOUNDS, LAMMP_ERROR_PARAM_ASSERT_FAILURE , 以及 LAMMP_ERROR_UNEXPECTED_ERROR.

被这些函数引用 lmmp_abort().

+ 这是这个函数的调用关系图:

变量说明

◆ lmmp_abort_func

atomic_uintptr_t lmmp_abort_func
static

在文件 abort.c12 行定义.

被这些函数引用 lmmp_abort() , 以及 lmmp_set_abort_fn().