1

PVS Studio 6.17(Windows 7、64Bit、VS2015)似乎对下面的代码给出了错误警告。警告“已创建 'unordered_map' 类型的 V808 'statuses' 对象但未使用”。使用几个 QStringLiteral 键值初始化 unordered_map 的原始代码。仅使用 STL 的简化版本如下所示:

#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 是在使用 lambda 中的返回值的通用初始化时产生的。如果使用构造函数语法,则不会显示警告。

另一个产生 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);

在这里,如果使用一个参数 lambdas 创建映射 - 没有 V808,它会呈现 2 个或更多参数。

参考:

这个问题已知吗?

4

1 回答 1

0

请不要创建此类问题。Stackoverflow 用户多次就类似问题发表评论。

  1. 其实没什么好回答的。这只是对工作不足的描述,而不是一个问题。错误报告和功能请求不是 Stack Overflow 上的主题。我想请你写下我们在类似情况下的支持。
  2. 请检查分析器是否针对书面合成示例生成警告。我无法通过检查已发布的代码来重现误报。我猜代码包含一些让分析器感到困惑的东西。或者分析器可能是正确的,例如,如果使用在非活动构造 #if...#endif 内。
于 2017-09-22T07:07:40.183 回答