gpt4 book ai didi

c - 我如何退出导致段错误的函数并返回调用函数

转载 作者:太空宇宙 更新时间:2023-11-04 08:55:06 25 4
gpt4 key购买 nike

您好,我正在尝试测试一段代码,看看它是否设计用于处理内存问题。
不幸的是,我必须通过 c-unit 来做到这一点,它不能很好地处理段错误(只是崩溃)
所以我的问题是我可以向我正在测试的代码添加一个信号处理程序以允许它退出有问题的函数而不是退出整个程序吗?

基本上我可以修改以下处理程序以退出函数并返回到我的 cunit 框架吗?

void sighandler(int signo, siginfo_t *si, ucontext_t* context)
{
printf("Handler executed for signal %d\n", signo);
exit(0); /* can i replace this with exit from function? */
}

最佳答案

这可以通过信号处理程序加上 setjmp/longjmp 来完成。

我不确定这个解决方案有多可靠。它在我测试时有效,但可能包含未定义的行为,所以不要依赖它。

同样重要的是要注意,有错误的代码可能会比段错误做更糟糕的事情。例如,它可能会损坏内存,因此您的测试代码或其他测试代码将失败。

下面的代码主要基于this answer .

#include <stdio.h>
#include <signal.h>
#include <setjmp.h>

static void good_func(void)
{
int q, *p = &q;
printf("%s running\n", __FUNCTION__);
*p = 3;

}
static void bad_func(void)
{
int *p = NULL;
printf("%s running\n", __FUNCTION__);
*p = 3;
}

static jmp_buf context;

static void sig_handler(int signo)
{
longjmp(context, 1);
}

static void catch_segv(int catch)
{
struct sigaction sa;

if (catch) {
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = sig_handler;
sa.sa_flags = SA_RESTART;
sigaction(SIGSEGV, &sa, NULL);
} else {
sigemptyset(&sa);
sigaddset(&sa, SIGSEGV);
sigprocmask(SIG_UNBLOCK, &sa, NULL);
}
}

typedef void (*func_t)(void);

static int safe_run(func_t func)
{
catch_segv(1);

if (setjmp(context)) {
catch_segv(0);
return 0;
}

func();
catch_segv(0);
return 1;
}

int main()
{
printf("good_func is %s\n", safe_run(good_func) ? "good" : "bad");
printf("bad_func is %s\n", safe_run(bad_func) ? "good" : "bad");
return 0;
}

关于c - 我如何退出导致段错误的函数并返回调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17585818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com