PVS-Studio是否了解前向声明的必要性?

时间:2018-03-09 13:10:52

标签: c++ visual-studio g++ forward-declaration pvs-studio

当不同的编译器表现不同时会出现问题。可惜,PVS并没有告诉我下面的危险情况。

我有一些重载函数,但我忘记写一个前向声明。因此,Visual Studio会编译一个程序和另一个编译器。

我的职能:

// For simple types (i.e. int, bool, char) and plain old data
template <typename T>
void serialize(T pod, std::ostream& out) {
    std::cout << "pod\n";
    out.write(reinterpret_cast<const char*>(&pod), sizeof(T));
}

void serialize(const std::string& str, std::ostream& out) {
    std::cout << "string\n";
    serialize(str.size(), out);

    out.write(str.data(), str.size());
}

template <typename T>
void serialize(const std::vector<T>& data, std::ostream& out) {
    std::cout << "vector\n";
    serialize(data.size(), out);

    for (const T& elem : data) {
        serialize(elem, out); // <== runs POD serialization for map :(
    }
}

template <typename T1, typename T2>
void serialize(const std::map<T1, T2>& data, std::ostream& out) {
    std::cout << "map\n";
    serialize(data.size(), out);

    for (const auto& p : data) {
        serialize(p.first, out);
        serialize(p.second, out);
    }
}

我用代码测试了这个:

std::vector<std::map<int, int>> v;
v.emplace_back();
v[0][1] = 2;

std::stringstream ss;

serialize(v, ss);

VS中的测试没问题(调试和发布版本):

vector
pod [size of vector]
map
pod [size of map]
pod [key = 1]
pod [value = 2]

但我的同事突然告诉我,一切都没有。

我已经在不同的编译器上测试过了(感谢Ideone网站)。一切行为都是错误的(gcc 4.3.2,6.3; clang 4.0):

vector
pod [size of vector]
pod [map]

当然,在所有函数之前放置声明之后,所有编译器中的一切都正确。

我要求对前方声明实施警告。

1 个答案:

答案 0 :(得分:0)

是的,PVS-Studio中存在这样的问题。我们会尽力修复它。