从函数返回时发生堆芯转储错误

Core dump error while returning from a function

本文关键字:转储 错误 函数 返回      更新时间:2023-10-16

我有一个函数:

void function(const string param1, string *p2param, string *retparam)

当从main调用该函数时,执行一直进行到该函数的最后一行,然后失败

Bus Error(coredump)

该函数使用指向字符串的指针执行一些字符串操作,然后将最终值传递给*retparam

代码如下:aa.c有

string *f1;//global
string f2= "abc";//global
function_2()
{
stringstream aa;
*f1 += aa<<"test";
//similar concatenation
 }
function(param1, *p2param, *retparam)
{
  /* assign back the values*/
  f1 =&f2;
  //call to a function from bb.c
  // from bb.c function_2() is in called
   retparam = f1
 }

我能得到的唯一信息是:

pstack core
$ pstack core
core 'core' of 4517:    aa_test -t 745
 ffffffff7c67109c __1cDstdMbasic_string4Ccn0ALchar_traits4Cc__n0AJallocator4Cc___2T5B6M_v_ (ffffffff7fffce98, 1002805fc, 10010cc90, 0, ffffffff7c8c3bd8, ffffffff7fffce98) + 14
 0000000100004498 main (10010b000, 100000, ffffffff7fffce98, ffffffff7fffcf00, ffffffff7fffd288, ffffffff7fffd0b8) + 818
 0000000100003a7c _start (0, 0, 0, 0, 0, 0) + 17c

导致此错误的原因是什么?

感谢您宝贵的意见,最终解决了我的问题。

问题是字符串变量的类型转换代码段

void function(const string param1, string *p2param, string *retparam)  {  
   //function to call from bb.c has prototype
    //fun2(const char **str,stubfunc)
    const char *l_str = param1.c_str();
    fun2((const char **) &l_str,coverage_hook);
}
//this was ealier called as 
//fun2((const char**) &param1,coverage_hook); hence was causing the core dump 
//why?? still dont know :)

如果retparam是传入时实际string的地址,那么在返回之前您真正想做的是

(*retparam) = f2;

设置retparam本身的值对您没有任何好处,因为它是函数中的局部变量,更改其值不会更改父级中的任何内容。但您可以更改指向的内存,这就是这里发生的情况。

返回一个指向f2的指针,f2是一个局部变量,当函数返回时会被销毁。

我在这里有点冒险,但我认为你的问题可能是你定义了这样的函数:

void function(const string param1, string *p2param, string *retparam)
{
    .
    .
    .
}

但你在某个地方(在头文件中?)这样声明它:

string function(const string param1, string *p2param, string *retparam);

(承诺它将具有返回类型string而不是void)。因此,当函数返回时,调用代码会尝试使用其返回值,当发现不是时,就会出现混乱。

(如果不是这样,而且很可能不是这样,那么我认为如果您发布完整的函数定义以及调用函数的代码会有所帮助。)