我正在得到掩护性 issuse 作为"Wrapper object use after free (WRAPPER_ESCAPE)"

I am getting coverity issuse as "Wrapper object use after free (WRAPPER_ESCAPE)"

本文关键字:free after use WRAPPER ESCAPE object Wrapper 掩护 作为 issuse      更新时间:2023-10-16

嗨,我得到Coverity问题"包装器对象使用后自由(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
}
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;
}

调用者在使用指针时必须删除指针,否则会出现内存泄漏。

你在这里返回一个悬垂指针,这从来都不是一件好事,这就是coverity抱怨的原因。

当你从std::string中取出c_str()时,这是一个不属于字符串底层内存的指针。当std::string被销毁时,内存将被释放,而const char *将被悬空。

在你的例子中,当函数退出时,局部变量hello被销毁,返回的指针也没用。

一般情况下,除非在向C库函数传递某些内容的直接上下文中,否则不应该使用c_str(),或者至少,这是避免这些问题的最直接的方法。