c++ 我得到的coverity issues作为“ Package 对象使用后,免费(WRAPPER_ESCAPE)”

mklgxw1f  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(219)

嗨,我得到的Coverity问题**“ Package 对象使用后,免费(WRAPPER_ESCAPE)1。escape:本地hello的内部表示转义,但在退出作用域时被销毁”**请帮助我修复它

extern  const char * Helloworld()
{
  std::string hello = obj->myfunction();

  return hello.c_str();   // this is return to a c function
}
8fq7wneg

8fq7wneg1#

std::string hello = obj->myfunction();

将创建一个带有自动存储的字符串。然后你用return hello.c_str();返回一个指针到下面的char*。这样做的问题是,在函数(})结束时,所有自动对象都被销毁。这将删除您刚刚传递的指针所指向的字符串的内容。在另一个函数中使用指针是未定义的行为,因为内存已被释放。
如果你想返回一个持久的char*,那么你需要为char*分配内存,并将字符串复制到其中。您可以使用以下命令执行此操作:

extern  char * Helloworld()
{
    std::string hello = obj->myfunction();
    char * returner = new char[hello.size() + 1];
    strcpy(returner, hello.c_str());
    return returner;
}

这样,调用者将不得不在完成时删除指针,否则将出现内存泄漏。

lfapxunr

lfapxunr2#

你在这里返回了一个悬空指针,这从来都不是一件好事,这就是为什么coverity会抱怨。
当你从std::string中取出c_str()时,这是字符串底层内存的一个 non-owning 指针。当std::string被销毁时,内存将被释放,而const char *将被悬空。
在你的例子中,当函数退出时,局部变量hello被销毁,返回的指针也就没用了。
一般来说,除非在直接向C库函数传递某些内容的情况下,否则不应该使用c_str(),或者至少这是避免这些问题的最直接的方法。

相关问题