PVS Studio 6.17 (Windows 7, 64Bit, VS2015) scheint eine falsche Warnung auf den folgenden Code zu geben. Warnung Das Objekt "V808 'Status' des Typs 'unordered_map' wurde erstellt, aber nicht verwendet". Ursprünglicher Code mit unordered_map, der mit mehreren QStringLiteral-Schlüsselwerten initialisiert wurde. Vereinfachte Version nur STL sieht wie folgt aus:False positive Warnung PVS Studio: V808 Objekt des Typs wurde erstellt, wurde aber nicht verwendet
#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;
}
Merkwürdiger ist, dass V808 erzeugt, wenn Universal-Initialisierung des Rückgabewert in Lambda verwendet wird. Wenn Sie die Konstruktorfunktionssyntax verwenden, wird die Warnung nicht angezeigt.
Ein weiterer falscher Fall V808 Herstellung ist hier:
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);
hier, wenn Karte mit einem Argumente lambda erstellen - keine V808, mit 2 oder mehr agruments es präsentiert.
Referenz:
Ist das Problem bekannt?
Unterstützt VS2015 nicht "abc" s? Das Makro scheint etwas umständlich. – chris
Kommt wirklich darauf an, wie schlau der statische Analysator ist. Der einzige Effekt, den Ihr Programm hat, ist "0 zurückgeben". Der gesamte andere Code könnte entfernt werden und es würde keine Änderung in der beobachtbaren Ausgabe geben. –
@RichardCritten Ich habe einige Ausgaben hinzugefügt, die einfach aus Gründen der Einfachheit weggelassen wurden. Aber es ändert nicht V808 Aussehen. –