Ложное положительное предупреждение 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

Ссылка

0

Решение

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]