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。
参考:
は知られている問題ですか?
VS2015は '' abc "sをサポートしていませんか?マクロはちょっと丸見えです。 – chris
本当にスタティック・アナライザがどれほど巧妙であるかによって異なります。あなたのプログラムが持つ唯一の効果は 'return 0;'です。他のコードはすべて削除でき、観察可能な出力には変更はありません。 –
@RichardCritten簡単にするために省略した出力をいくつか追加しました。しかし、V808の外観は変わりません。 –