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.c 第 42 行定义.
42 {
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)
static atomic_uintptr_t lmmp_abort_func
void(* lmmp_abort_fn)(lmmp_error_t type, const char *msg, const char *func, int line)
LAMMP 全局退出函数指针类型
引用了 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_().