Ложное положительное предупреждение PVS Studio: V821 Снижение производительности. Переменная 'rhs' может быть создана в области более низкого уровня

PVS Studio 6.17 (Windows 7, 64Bit, VS2017, C++-03), похоже, выдает неправильное предупреждение о следующем сокращенном коде

#include <stack>
#include <string>
#include <vector>
bool fred(const std::string &x)
{
    return x == "ab";
}
std::vector<std::string> bar(std::stack<std::string> & s)
{
    std::vector<std::string> v;
    const std::string rhs(s.top()); // V821 Decreased perfomance. The 'rhs' variable can be constructed in a lower level scope.
    s.pop();
    const std::string lhs(s.top());
    s.pop();

    if (fred(lhs))
    {
        v.push_back(rhs);
    }
    return v;
}

Предупреждение от студии PVS есть

V821 Снижение производительности. Переменная 'rhs' может быть создана в области более низкого уровня.

поскольку s это std::stackтип, и соответствующий алгоритм требует, чтобы rhs-элемент выталкивается из стека, похоже, что PVS-Studio не так. Я что-то пропустил?

Кстати:

В PVS Studio есть опечатка:

   perfomance->performance

Ссылка

1 ответ

Решение

В комментариях обсуждаются способы оптимизации кода. Да, это можно оптимизировать, хотя, я думаю, в этом нет практически никакого смысла. Если вам придется использовать C++-03, то из-за оптимизации код станет сложным для понимания, что плохо. Ну, конечно, было бы целесообразно использовать std::move.

Теперь, говоря о PVS-Studio. Анализатор не прав, выдает здесь предупреждение. Невозможно просто взять и переместить переменную rhs создавая внутри if-объем. Анализатор не учел, что источник данных изменится и s.top() вернул бы другое значение. Что ж, диагностика V821 является новой и есть недостатки. Мы постараемся убрать такого рода ложные срабатывания. Спасибо за приведенный пример, а также за информацию о опечатке со словом "производительность".

Другие вопросы по тегам