【问题标题】:I am getting coverity issuse as "Wrapper object use after free (WRAPPER_ESCAPE)"我将覆盖问题作为“释放后使用包装器对象(WRAPPER_ESCAPE)”
【发布时间】:2015-10-05 14:17:56
【问题描述】:

您好,我遇到了 Coverity 问题,因为 “释放后使用包装器对象 (WRAPPER_ESCAPE)1。转义:本地 hello 的内部表示转义,但在退出范围时被破坏”请帮助我修复它

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

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

【问题讨论】:

  • 相当不言自明的消息,我应该想到的。你具体有什么问题?

标签: c++ string coverity


【解决方案1】:
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;
}

这样,调用者必须在完成后删除指针,否则会出现内存泄漏。

【讨论】:

  • 有什么好的方法可以在不影响代码功能的情况下修复它?
  • @pravupp 你不能直接返回std::string吗?
  • 我的调用函数是 c 风格的,所以我不能使用 std::string 作为返回类型
  • @pravupp 添加到我的答案中。让我知道这是否能解决您的问题。
  • 感谢您的 ans 很好,但有一个小疑问,我可以将 std::string hello 作为 .h 文件中的全局变量吗?
【解决方案2】:

你在这里返回了一个悬空指针,这从来都不是一件好事,这就是覆盖率抱怨的原因。

当您从std::string 中获取c_str() 时,这是字符串底层内存的非拥有 指针。当std::string 被销毁时,内存将被释放,const char * 将保持悬空状态。

在你的情况下,当函数退出时,局部变量hello被破坏,返回的指针没有用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多