Почему «Потенциальная утечка памяти, на которую указывает поле» в таблице поиска фабрики

#memory-leaks #c 17 #static-analysis

#утечки памяти #c 17 #статический анализ

Вопрос:

Я пытаюсь реализовать фабрику, которая создает новые экземпляры типов, унаследованных общим полем базового класса.

Фабрика моделируется как поисковая таблица для заводских функций, которые возвращают unique_ptr. Ключевым типом справочной таблицы является string_view .

В заводских функциях я вызываю make_unique для запрошенного типа.

clang-анализатор жалуется на потенциальную утечку памяти при возврате unique_ptr.

Таблица поиска фабрики с единственной доступной записью фабрики.

   using FieldFactory = std::function< std::unique_ptr< Field >( node constamp;, Clf constamp; ) >;

  static const std::unordered_map< std::string_view, FieldFactory > fieldFactoryLut = {
    {"static-text"sv, []( auto constamp; node, auto constamp; parent ) { return std::make_unique< StaticTextField >( node, parent ); }}
  };

 

Использование

 auto constamp; factoryFun = fieldFactoryLut.at("static-text"sv);
auto uPtr = factoryFun(node, clf);

 

Вызывая make_unique, я не ожидаю возможной утечки памяти, но утверждает clang-analyzer:

 warning: Potential leak of memory pointed to by field '_M_head_impl' [clang-analyzer-cplusplus.NewDeleteLeaks]
[build]     {"static-text"sv, []( auto constamp; node, auto constamp; parent ) { return std::make_unique< StaticTextField >( node, parent ); }}
 

Кто-нибудь может сказать мне, что здесь видит clang?

Комментарии:

1. Какую версию clang вы используете? Я не смог воспроизвести это с версиями 7 или 8. Можете ли вы предоставить ссылку на godbolt?

2. Я запустил scan-build-7, который поставляется с clang 7.0.0.3