2017-09-28 6 views
1

PVS Studio는 위험한 표현에 대해 불평합니다. 매개 변수 'MSG는'다음 코드 C++ 코드에 괄호로 묶어야합니다위험한 매크로 표현에 대해 불평하는 PVS Studio

#include <iostream> 

#define X ("X") 
#define Y ("Y") 
#define Z ("Z") 

#define FRED(msg) msg << Z  // <<-- Warning from PVS Studio 
#define WILMA(msg) X << FRED(msg) 
#define BUDDY(msg) Y << FRED(msg) 
int main() 
{ 
    std::cout << WILMA(BUDDY("xxxxxx")) << std::endl; 
    return 0; 
} 

PVS 스튜디오에서 경고 메시지가이 도구에서 제안 및 추가 괄호 다음

V1003 The macro 'FRED' is a dangerous expression. The parameter 'msg' must be surrounded by parentheses. sample_demo.cpp 7 

입니다 : 사용법 #include

이 변경으로 인해 잘못된 코드가 생성 된 것으로 보입니다. 다음과 같이 VS2017에서 컴파일러 오류는 다음과 같습니다

error C2296: '<<': illegal, left operand has type 'const char [2]' 
error C2297 : '<<' : illegal, right operand has type 'const char [7]' 

질문

내가 PVS 스튜디오에서 제안이 특정 경우에 정확하지 않습니다 확신합니다. 나는 명백한 무언가를 놓치고 도구가 맞습니까? 미리 감사드립니다.

+0

@bartoli : 감사합니다. 그러나 이미 설명한 것과 같은 컴파일러 오류가 발생합니다. – orbitcowboy

+1

https://stackoverflow.com/questions/277258/how-do-i-see-a-c-c-source-file-after-preprocessing-in-visual-studio –

답변

1

설명서에도이 내용이 나와 있습니다. V1003 진단 규칙은 사전 처리되지 않은 코드에서 작동하며 분석기는 향후이 매크로의 사용 방법에 대한 정보가 없습니다. 진단 룰을 사용하면 잘못된 산술 연산을 초래할 수있는 매크로의 오류를 식별 할 수 있습니다. 그러나 때로는 실패합니다. 더 정확한 V733 진단이 있지만 불행히도 많은 경우를 놓칠 수 있습니다.

인용 부호가있는 소스 코드는 분석기가 '< <'이 정수 값 시프트 연산이 될 수 있다고 생각하기 때문에 오 탐지에 이르게합니다. 그러한 가양 성의 수가 너무 많으면 V1003 진단을 비활성화 할 수 있습니다. 그러나 이것이 분리 된 사례 인 경우 위양성 억제 코멘트를 사용하는 것이 좋습니다.

#define FRED(msg) (msg) << Z //-V1003 

다음은 대안입니다. 당신은이 같은 코멘트 사용할 수 있습니다 다음 '< <'연산자를 사용하는 경우이 경우

//-V:<<:1003 

을의 V1003 진단 트리거되지 않습니다. 이 주석은 전역 헤더 파일 (예 : stdafx.h) 또는 진단 구성 파일 (.pvsconfig) 중 하나에 배치 할 수 있습니다. 가양 성을 억제하는 이들 및 다른 방법에 대한 자세한 설명은 Suppression of false alarms 설명서에서 제공됩니다.

2

이 경고는 산술 표현식을 대상으로합니다. 예를 들어, msg0xf & 8 인 경우 괄호를 생략하면 operator <<&보다 우선 순위가 높으므로 다른 결과가 발생할 수 있습니다.