【问题标题】:Clang Static Analyzer complains about memory leak when using protobuf's set_allocated_*Clang 静态分析器在使用 protobuf 的 set_allocated_* 时抱怨内存泄漏
【发布时间】:2021-04-16 11:02:58
【问题描述】:

使用以下 proto 文件

message Foo {
    // ...
}

message MyMessage {
    Foo foo = 1;
}

我使用生成的set_allocated_foo 方法设置foo,该方法获取指针的所有权:

MyMessage m;
m.set_allocated_foo(new Foo);

m 离开范围时,clang-tidy 给了我以下警告:

warning: Potential memory leak [clang-analyzer-cplusplus.NewDeleteLeaks]
}
^
note: Memory is allocated
    m.set_allocated_foo(new Foo);
                        ^

有什么办法可以避免吗? (不使用// NOLINT

【问题讨论】:

  • 答案在以下链接中:stackoverflow.com/a/33995232/994042。 “只要你不调用release_,protobuf会负责删除对象。如果你在处理完Protobuf Message之后需要Object,你需要使用release_来释放它,这样会阻止Protobuf删除您的对象。”
  • 这只是告诉我警告是误报。我该如何避免呢?
  • 您可以禁用检查:clang-tidy test.cpp -checks=-clang-analyzer-cplusplus.NewDeleteLeaks
  • 这比使用// NOLINT 还要糟糕,因为它还会禁用其他有用的消息。所以这只是 clang-tidy 的一个 bug?
  • “潜在的内存泄漏”意味着在这个地方内存可能不会被释放。您可以自己手动释放它。不是clang-tidy的bug,可能是clang-tidy检查的bug。

标签: c++ protocol-buffers clang-static-analyzer clang-tidy


【解决方案1】:

一种方法是使用#ifdef __clang_analyzer__

MyMessage m;
auto* f = new Foo;
m.set_allocated_foo(f);
#ifdef __clang_analyzer__
delete f
#endif

我不知道这是否是最好的方法。

【讨论】:

    猜你喜欢
    • 2013-01-29
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多