Ложное положительное предупреждение PVS Studio: объект типа V808 был создан, но не использовался

PVS Studio 6.17 (Windows 7, 64Bit, VS2015), похоже, выдает неправильное предупреждение в приведенном ниже коде. Предупреждение "V808 'статусы' объект типа 'unordered_map' создан, но не использовался". Исходный код с unordered_map, инициализированный несколькими значениями ключа QStringLiteral. Упрощенная версия с использованием только STL выглядит так:

#include <string>
#include <unordered_map>
#include <iostream>

// Simplified analogue of QStringLiteral
#define StringLiteral(str) ([]() { return std::string{str}; }())

int main()
{
    const std::unordered_map<std::string, int> statuses{
        { StringLiteral("aaa"), 1 },
        { StringLiteral("bbb"), 2 },
        { StringLiteral("ccc"), 3 }
    };

    auto iter = statuses.find("aaa");
    if (iter != statuses.cend())
        std::cout << iter->first << " has status: " << iter->second << std::endl;
    return 0;
}

Любопытно, что V808 создается, когда используется универсальная инициализация возвращаемого значения в лямбда-выражении. Если использовать синтаксис функции конструктора, предупреждение не отображается.

Другой ложный случай производства V808 находится здесь:

const std::unordered_map<int, std::function<void(int, int)>> functions{
    { 0, [](int a, int b) {} },
    { 1, [](int a, int b) {} },
};

const auto it = functions.find(0);
if (it != functions.cend() && it->second)
    it->second(1, 2);

Здесь, если создать карту с одним аргументом lambdas - без V808, с двумя или более агрументами, которые он представляет.

Ссылка:

Эта проблема известна?

1 ответ

Пожалуйста, не создавайте вопросы таких типов. Пользователи Stackru неоднократно комментировали подобные проблемы.

  1. Там на самом деле нечего ответить. Это просто описание недоделок, а не вопрос. Отчёты об ошибках и запросы функций здесь не по теме переполнения стека. Я хотел бы попросить вас просто написать о нашей поддержке в подобных ситуациях.
  2. Пожалуйста, проверьте, что для письменных синтетических примеров анализатор выдает предупреждение. Я не смог воспроизвести ложный положительный результат, проверив опубликованный код. Я предполагаю, что код содержит нечто, что сбивает с толку анализатор. Или анализатор может быть прав, если, например, использование находится внутри неактивной конструкции #if...#endif.
Другие вопросы по тегам