c - 出现错误时安全退出到特定状态

标签 c embedded malloc exit safety-critical

在编写代码时,我经常检查是否发生错误。一个例子是:

char *x = malloc( some_bytes ); 
if( x == NULL ){
    fprintf( stderr, "Malloc failed.\n" ); 
    exit(EXIT_FAILURE); 
}

我过去也使用过 strerror( errno )

我只写过小型桌面应用程序,在出现错误的情况下程序exit()ed 并不重要。

但是,现在我正在为嵌入式系统 (Arduino) 编写 C 代码,我不希望系统在出现错误时退出。我希望它进入一个特定的状态/功能,它可以关闭系统、发送错误报告和安全空闲。

我可以简单地调用一个 error_handler() 函数,但我可能处于堆栈深处并且内存非常低,导致 error_handler() 无法运行。

相反,我希望执行能够有效地折叠堆栈,释放大量内存并开始整理掉电和错误报告。如果系统不能安全关闭电源,则存在严重的火灾风险。

是否有在低内存嵌入式系统中实现安全错误处理的标准方法?

编辑 1: 我将限制在嵌入式系统中使用 malloc()。在这种特殊情况下,如果文件格式不正确,则在读取文件时会发生错误。

最佳答案

也许你在等待圣洁setjmp/longjmp ,那个来拯救他们所有渴望内存的罪孽的人?

#include <setjmp.h>

jmp_buf jumpToMeOnAnError;
void someUpperFunctionOnTheStack() {
    if(setjmp(jumpToMeOnAnError) != 0) {
        // Error handling code goes here

        // Return, abort(), while(1) {}, or whatever here...
    }

    // Do routinary stuff
}

void someLowerFunctionOnTheStack() {
    if(theWorldIsOver)
       longjmp(jumpToMeOnAnError, -1);
}

编辑:出于与您所说相同的原因,最好不要在嵌入式系统上执行malloc()/free()。简直拿不准。除非您使用大量 返回码/setjmp() 来释放堆栈中的所有内存...

关于c - 出现错误时安全退出到特定状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32537230/

相关文章:

algorithm - 使用 1 MB RAM 对 100 万个 8 位十进制数字进行排序

c - 为什么我每次使用 malloc 都会收到警告?

分配时从 lua 调用'c 崩溃

c - 函数未指定返回值

c - 如何使用递归删除数组中的相邻重复项?

c - 仅当缓冲区可以就地增长时才调整缓冲区大小的内存分配?

embedded - 链接器和体系结构

c - Cello 库如何能够引入运算符和关键字的使用,即使它们不是 C 库的一部分?

c - 使用 ‏μC/OS-II 直接解析 json

c - 将 int 视为地址/指针