2017-09-28 2 views
1

PVSスタジオは危険な表現について苦情を言います。パラメータ「MSG」が次のコードのC++コードを括弧で囲まなければなりませんPVSスタジオが危険なマクロ表現に苦情を言います

#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 Studioから警告メッセージが、このツールからの提案および追加括弧後

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

です: の#include

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

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

この変更により、無効なコードが作成されたようです。次のように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 <<&よりも優先度が高いため、カッコを省略すると異なる結果が得られる場合があります。

関連する問題