Clang Static Analyzer жалуется на утечку памяти при использовании protobuf set_allocated_*

Со следующим прото-файлом

message Foo {
    // ...
}

message MyMessage {
    Foo foo = 1;
}

Я установил foo с помощью сгенерированного метода set_allocated_foo, который берет на себя управление указателем:

MyMessage m;
m.set_allocated_foo(new Foo);

clang-tidy выдает следующее предупреждение, когда m покидает область видимости:

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

Есть ли способ избежать этого? (без использования // NOLINT)


person jhasse    schedule 11.01.2021    source источник
comment
Ответ находится по следующей ссылке: stackoverflow.com/a/33995232/994042. Пока вы не вызываете release_, protobuf позаботится об удалении объекта. Если вам нужен объект после обработки сообщения Protobuf, вам нужно освободить его с помощью release_, что не позволит Protobuf удалить ваш объект.   -  person Thien Tran    schedule 15.02.2021
comment
Это просто говорит мне, что предупреждение является ложным срабатыванием. Как этого избежать?   -  person jhasse    schedule 15.02.2021
comment
Вы можете отключить проверку с помощью: clang-tidy test.cpp -checks=-clang-analyzer-cplusplus.NewDeleteLeaks   -  person Thien Tran    schedule 16.02.2021
comment
Это даже хуже, чем использование // NOLINT, потому что это также отключит другие полезные сообщения. Так это просто ошибка в clang-tidy?   -  person jhasse    schedule 17.02.2021
comment
ПОТЕНЦИАЛЬНАЯ утечка памяти означает, что в этом месте память НЕ МОЖЕТ быть освобождена. Вы можете вручную освободить его самостоятельно. Это не баг clang-tidy, это может быть баг проверки clang-tidy.   -  person Thien Tran    schedule 17.02.2021
comment
Память всегда будет освобождаться объектом protobuf и никогда не будет утекать.   -  person jhasse    schedule 17.02.2021


Ответы (1)


Один из способов, который вы можете сделать, это использовать #ifdef __clang_analyzer__:

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

Я не знаю, лучший ли это способ.

person kkpattern    schedule 20.05.2021