栈溢出导致程序段错误 Segmentation fault

问题描述:主线程里创建一个子线程,主线程调用pthread_join()等待子线程执行完成再结束,但是子线程的执行体执行完成之后,出现段错误Segmentation fault,在主线程pthread_join()调用前后都加上打印信息,发现接口调用之前的打印有,接口调用之后的打印没有;
问题分析:pthread_join()接口就是一个阻塞函数,等待子线程执行,子线程执行体执行完之后,会继续执行pthread_join()后面的代码,所以出现问题的代码就一定是子线程的执行体,出现Segmentation fault,很可能就是有内存方面的泄露,内存没有释放,数组越界,要重点看一下子线程执行体内部的指针和数组,是否有这方面的问题,最终发现是数组出现了越界;分析代码如下:

#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
 
#if 0
void *thread_function(void *arg)
{
   char str[8] = {0};
   sprintf(str, "hhhhhhhhhhhhhhhhhhhhhhh");
   std::cout << "sizeof str = " << sizeof(str) << std::endl;
   std::cout << "sizeof str = " << strlen(str) << std::endl;
   return NULL;
}
int main(void)
{
  pthread_t mythread;
  if (pthread_create(&mythread,NULL,thread_function,NULL))
 {
    printf("error creating thread.");
   // abort();
  }
  printf("<<<<< thread is running");
  if( pthread_join(mythread,NULL))
  {
    printf("error join thread.");
    //abort();
  }
  printf("thread done! \n");
  //exit(0);
}
#endif

void Function()
{
	char str[8] = {0};
	sprintf(str, "hhhhhhhhhhhhhhhhhhhhhhhhhh");
	std::cout << "Function is called" << std::endl;
	std::cout << str << std::endl;
	std::cout << "sizeof str = " << sizeof(str) << std::endl;
	std::cout << "sizeof str = " << strlen(str) << std::endl;
}
int main()
{
	std::cout << "hello" << std::endl;
	Function();
	std::cout << "world" << std::endl;
}

在子线程里对一个数组进行赋值,在子线程执行体内部使用时,是没有任何问题的,一旦要退出线程执行体,就会报段错误,就是因为在执行体里定义的局部数组str出现了越界,使用的时候是没有任何问题的,一旦要退出执行体时,就要释放局部的数组str占的栈空间,定义的是8个字节,但是赋值确实大于8个字节,str的长度大于8,释放的时候踩到其他内存了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值