Знает ли 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]

Конечно, после размещения предварительных объявлений перед всеми функциями все стало правильно во всех компиляторах.

Прошу реализовать предупреждение о предварительной декларации.

0

Решение

Да, в PVS-Studio есть такая недоработка. Мы сделаем все возможное, чтобы исправить это с течением времени.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]