Tag: sigsegv

‘C’分段故障与2darrays

谁能解释一下为什么这段代码不起作用? #include #include void findAndPrint(char *arr[], int year, int month, int day); int main() { char *dayTab[] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; findAndPrint(dayTab, 3, 3, 3); getchar(); return 0; } void findAndPrint(char *arr[], […]

DSO中的SIGSEGV,混合C / C ++

我正在为C ++使用SWI-Prolog 外语接口 ,试图集成其他一些资源。 它主要起作用,但任何抛出exception的尝试都会导致SIGSEGV。 例外通常用于validation用户参数,因此是界面的基本部分。 我正在从源代码(通过提供的脚本)编译SWI-Prolog,并且CXX标志是 -c -O2 -gdwarf-2 -g3 -Wall -pthread -fPIC 我正在使用相同的标志来编译我的C ++代码,它是在.so中组装的,在SWI-Prolog中动态加载(我认为通过dlopen)。 在SEGV显示IP在,__cxa_allocate_exception内部之后检查堆栈(通过GDB)。 可能__cxa_get_globals @ plt无法访问。 Dump of assembler code for function __cxa_allocate_exception: 0x00007ffff1d80220 : push %r12 0x00007ffff1d80222 : lea 0x80(%rdi),%r12 0x00007ffff1d80229 : push %rbp 0x00007ffff1d8022a : mov %r12,%rdi 0x00007ffff1d8022d : push %rbx 0x00007ffff1d8022e : callq 0x7ffff1d1de30 0x00007ffff1d80233 : test %rax,%rax […]

SIGSEGV,(貌似)由printf引起

首先,对任何交叉发布道歉。 希望我不是在这里重复一个问题,但我无法在其他地方找到这个问题(通过Google和Stack Overflow)。 这是错误的要点。 如果我在代码中的任何地方调用printf , sprintf或fprintf来显示浮点数,我会收到SIGSEGV (EXC_BAD_ACCESS)错误。 让我举个例子。 以下引发错误: float f = 0.5f; printf(“%f\n”,f); 此代码不: float f = 0.5f; printf(“%d\n”,f); 我意识到那里有隐含的转换,但我并不关心这一点。 我只是无法理解为什么打印浮点数而不是打印整数会产生错误。 注意:部分代码使用malloc来创建一些非常大的多维数组。 但是,这些打印语句不会以任何方式引用这些数组。 这是我如何声明这些数组的示例。 #define X_LEN 20 #define XDOT_LEN 20 #define THETA_LEN 20 #define THETADOT_LEN 20 #define NUM_STATES (X_LEN+1) * (XDOT_LEN+1) * (THETA_LEN+1) * (THETADOT_LEN+1) #define NUM_ACTS 100 float *states = (float *)malloc(NUM_STATES […]

libsigsegv并响应堆栈溢出

我们正在尝试测试学生代码,并且为了自动化该过程,我们想要检测学生的代码是否溢出堆栈。 我使用libsigsegv库及其相应的stackoverflow_install_handler获得了一些成功。 它的工作非常出色,直到学生的代码两次打击堆栈。 例如,这里是一些示例输出: [# ~]$ ledit ./interpreter -> (use solution) -> (fun 1 2) *** Stack overflow detected *** -> (fun 1 2) Signal -10 [# ~] 初始“ *检测到堆栈溢出* ”是理想的输出。 在第二次吹掉堆栈之后,我得到的只是一个无用的“Signal -10”,程序停止执行。 我想再次看到堆栈溢出检测到的消息,让代码继续执行。 在我的堆栈溢出处理程序中,我只是将溢出检测消息打印到stderr并且长时间跳回到解释器中的“等待输入状态”。 谢谢你的帮助! 编辑 根据下面的caf的建议,我们添加了对sigsegv_leave_handler()的调用,如下所示: static void continuation(void *arg1, void *arg2, void *arg3) { (void)(arg1); (void)(arg2); (void)(arg3); siglongjmp(errorjmp, 1); } static void […]

C中的递归深度是否有任何硬连线限制

正在讨论的程序试图使用recursion来计算sum-of-first-n-natural-numbers 。 我知道这可以使用一个简单的公式n*(n+1)/2但这里的想法是使用recursion 。 该计划如下: #include unsigned long int add(unsigned long int n) { return (n == 0) ? 0 : n + add(n-1); } int main() { printf(“result : %lu \n”, add(1000000)); return 0; } 该程序在n = 100,000时运行良好,但当n的值增加到1,000,000 ,会导致Segmentation fault (core dumped) 以下内容取自gdb消息。 Program received signal SIGSEGV, Segmentation fault. 0x00000000004004cc in add (n=Cannot access […]

malloc()如何导致SIGSEGV?

我的程序中有一个奇怪的错误,在我看来malloc()正在引起一个SIGSEGV,据我所知,这没有任何意义。 我正在使用一个名为simclist的库来创建动态列表。 这是一个稍后引用的结构: typedef struct { int msgid; int status; void* udata; list_t queue; } msg_t; 这是代码: msg_t* msg = (msg_t*) malloc( sizeof( msg_t ) ); msg->msgid = msgid; msg->status = MSG_STAT_NEW; msg->udata = udata; list_init( &msg->queue ); list_init是程序失败的地方,这里是list_init的代码: /* list initialization */ int list_init(list_t *restrict l) { if (l == NULL) return -1; srandom((unsigned […]

分段违规后恢复生机

在Segmentation Fault错误之后,是否可以恢复C程序的正常执行流程? struct A { int x; }; A* a = 0; a->x = 123; // this is where segmentation violation occurs // after handling the error I want to get back here: printf(“normal execution”); // the rest of my source code…. 我想要一个类似于NullPointerException的机制,它存在于Java,C#等中。 注意 :请不要告诉我C ++中有一个exception处理机制,因为我知道,不要告诉我在分配之前应该检查每个指针等。 我真正想要实现的是恢复正常的执行流程,如上例所示。 我知道可以使用POSIX信号进行一些操作。 应该怎么样? 其他想法?