2017-09-05 9 views
0

PVS 스튜디오 6.17에서 구성 할 수있다 (윈도우 7, 64 비트는 VS2017는 C++ - 03) 코드를거짓 긍정 경고 PVS Studio : V821 성능 저하. '우'변수가 낮은 수준 범위

#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 요소가 스택에서 튀어 나와야하므로 PVS-Studio가 잘못된 것처럼 보입니다. 내가 뭐 놓친 거 없니? 그런데

는 :

perfomance->performance 

참조

+1

어쩌면 PVS가'rhs'에 대해서 말하는 것은'fred (lhs)'가 true 일 때만 사용됩니다. 비록 당신이 그것을 바꿀 수 없다하더라도 (당신은 정말로 가능하지 않습니까?) 저는 그것을 진정한 긍정적 인 것으로 생각할 것입니다. – user463035818

+1

나는 이것으로부터 어떤 종류의 대답을 얻기를 희망하는지 모르겠습니다. 잠재적으로 코드를 약간 재정렬 할 수 있으며 경고가 변경 될 수 있지만 결국에는 문제가되지 않습니다. 그들의 문서조차 오 탐율에 대해 이야기합니다. https://www.viva64.com/en/w/V821/ –

+1

당신은 std :: move rhs와 lhs를 즉시 사용할 수 있기 때문에 이것을 할 수 있습니다. 복사본을 피할거야. –

답변

2

코드의 최적화의 의견 가지 방법에서 :

PVS 스튜디오 메시지에 오타가있다 논의했다. 예, 최적화 할 수는 있지만 실제로는 아무런 문제가 없다고 생각합니다. C++ - 03을 사용해야하는 경우 최적화 때문에 코드가 이해하기 쉽지 않을 수 있습니다. 음, 확실히 std :: move를 사용하는 것이 적절할 것입니다.

이제 PVS-Studio에 대해 말하면서 분석기가 옳지 않아 여기에 경고가 표시됩니다. if 범위 내에 생성하는 변수 rhs을 가져 와서 이전 할 수는 없습니다. 분석기는 데이터 소스가 변경되고 s.top()이 다른 값을 반환한다는 사실을 고려하지 않았습니다. V821 진단은 새로운 것이고 단점이 있습니다. 우리는 그런 종류의 가양 성을 제거하려고 노력할 것입니다. 주어진 예를 들어 주셔서 감사 드리며 또한 오타에 대한 정보를 "성능"이라는 단어로 알려 주시면 감사하겠습니다.