2017-09-05 89 views
0

PVS工作室6.17來構造(Windows 7中,64位,VS2017,C++ - 03)似乎給一個錯誤警告上以下降爲代碼錯誤肯定警告PVS Studio:V821性能下降。在「RHS」變量可以在一個較低的水平範圍

#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'變量可以在較低級別的範圍內構建。

由於sstd::stack類型,並且相應的算法要求從堆棧中彈出rhs -element,所以它看起來像PVS-Studio是錯誤的。我錯過了什麼?

順便說一句:

有一個在PVS工作室消息一個錯字:

perfomance->performance 

參考

+1

也許PVS正在討論'rhs'開始只有在'fred(lhs)'爲真時才使用。即使你不能改變(你真的不能嗎?)我會認爲這是一個真正的積極的 – user463035818

+1

我不確定你希望從中得到什麼樣的答案。您可能會稍微重新排列代碼,並可能會更改警告,但最終可能並不重要。甚至他們的文件談判的誤報。 https://www.viva64.com/en/w/V821/ –

+1

你可以std ::移動rhs和lhs,因爲你之後立即彈出它們。它會避免複製。 –

回答

2

在代碼優化的意見的方式是討論。是的,它可以優化,但我認爲它幾乎沒有任何意義。如果你必須使用C++ - 03,那麼由於優化,代碼將變得很難理解,這很糟糕。那麼,當然,使用std :: move會比較合適。

現在談談PVS-Studio。分析儀是不正確的,在這裏發出警告。在if範圍內創建變量rhs是不可能的。分析儀沒有考慮到數據源會發生變化,並且s.top()會返回另一個值。那麼,V821診斷是新的,有缺點。我們將盡力消除這種誤報。感謝您給出的例子,以及有關錯字「性能」的信息。

相關問題