2017-09-21 7 views
1

PVS Studio 6.17(Windows 7、64Bit、VS2015)は、以下のコードで間違った警告を出すようです。 警告「V808」ステータスの 'unordered_map'タイプのオブジェクトが作成されましたが、使用されませんでした。 複数のQStringLiteralキー値で初期化されたunordered_mapを持つオリジナルコード。唯一のSTLを使用して簡素化されたバージョンは、次のようになります。偽陽性警告PVS Studio:タイプのV808オブジェクトが作成されましたが、利用されていません

#include <string> 
#include <unordered_map> 
#include <iostream> 

// Simplified analogue of QStringLiteral 
#define StringLiteral(str) ([]() { return std::string{str}; }()) 

int main() 
{ 
    const std::unordered_map<std::string, int> statuses{ 
     { StringLiteral("aaa"), 1 }, 
     { StringLiteral("bbb"), 2 }, 
     { StringLiteral("ccc"), 3 } 
    }; 

    auto iter = statuses.find("aaa"); 
    if (iter != statuses.cend()) 
     std::cout << iter->first << " has status: " << iter->second << std::endl; 
    return 0; 
} 

は不思議ラムダで戻り値のユニバーサル初期化を使用する場合V808が生じていることです。コンストラクタ関数の構文を使用すると、警告は表示されません。 V808を生産

もう一つの偽の場合はここにある:ここで

const std::unordered_map<int, std::function<void(int, int)>> functions{ 
    { 0, [](int a, int b) {} }, 
    { 1, [](int a, int b) {} }, 
}; 

const auto it = functions.find(0); 
if (it != functions.cend() && it->second) 
    it->second(1, 2); 

1つの引数のラムダでマップを作成する場合 - それは提示2以上agrumentsで、無V808。

参考:

は知られている問題ですか?

+0

VS2015は '' abc "sをサポートしていませんか?マクロはちょっと丸見えです。 – chris

+0

本当にスタティック・アナライザがどれほど巧妙であるかによって異なります。あなたのプログラムが持つ唯一の効果は 'return 0;'です。他のコードはすべて削除でき、観察可能な出力には変更はありません。 –

+0

@RichardCritten簡単にするために省略した出力をいくつか追加しました。しかし、V808の外観は変わりません。 –

答えて

0

このような種類の質問は作成しないでください。 Stackoverflowユーザーは、同様の問題について繰り返しコメントしています。

  1. 実際には何も答えません。それは単なる質問ではなく、過小評価の記述です。バグレポートと機能要求はnot on-topicここでスタックオーバーフローです。同様の状況でsupportと書いてもらいたいと思います。
  2. 書面による合成例では、アナライザーが警告を生成することを確認してください。私は、公開されたコードをチェックすることによって偽陽性を再現することができませんでした。私は、コードにアナライザを混乱させる何かが含まれていると思います。例えば、使用状況がinactive construction #if ... #endifの内部にある場合、アナライザーは正しいかもしれません。
関連する問題