2017-09-21 3 views
1

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?

+0

Unterstützt VS2015 nicht "abc" s? Das Makro scheint etwas umständlich. – chris

+0

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. –

+0

@RichardCritten Ich habe einige Ausgaben hinzugefügt, die einfach aus Gründen der Einfachheit weggelassen wurden. Aber es ändert nicht V808 Aussehen. –

Antwort

0

Bitte, erstellen Sie keine Fragen zu solchen Typen. Stackoverflow-Benutzer haben sich wiederholt zu ähnlichen Problemen geäußert.

  1. Es gibt eigentlich nichts zu beantworten. Es ist einfach eine Beschreibung von Unterarbeiten und nicht eine Frage. Fehlerberichte und Feature-Anfragen sind not on-topic hier auf Stack Overflow. Ich möchte Sie bitten, in ähnlichen Situationen einfach auf unsere support zu schreiben.
  2. Bitte überprüfen Sie, ob der Analysator für schriftliche Beispiele eine Warnung generiert. Ich war nicht in der Lage, das falsche Positive zu reproduzieren, indem ich veröffentlichten Code prüfte. Ich denke, der Code enthält etwas, das den Analysator verwirrt. Oder der Analysator hat möglicherweise Recht, wenn sich die Verwendung beispielsweise in der inaktiven Konstruktion #if ... # endif befindet.
Verwandte Themen