Комментарии 23
В начале содержимое объекта перемещается, а затем он используется как ни в чём не бывало
Это не всегда плохо. В случае конкретно «умных указателей» — да, использование после перемещения может свидетельствовать о проблеме, но в общем случае это не так. Перемещенный объект вполне можно переиспользовать заново (это ведь просто default constructed объект как правило), это обычная оптимизация и далеко не всегда ошибка.
Анализтор предупреждает только об аномальном использовании.
Извините, но ЕМНИП по стандарту использование объекта после std::move небезопасно (кроме операций, не зависящих от состояния объекта). Потому что состояние объекта после перемещения стандартом определено только как "valid but unspecified", i.e. там может быть всё что угодно, и сказать, что именно там будет, не зная деталей реализации компилятора и стандартной библиотеки, нельзя. Так что такая "оптимизация" — непереносимый код. Сюрпризы теоретически могут быть даже при смене версии компилятора.
std::move() сам по себе ничего не делает. Это по сути всего лишь приведение типа для того, чтобы вызвался нужный метод (принимающий в качестве аргумента rvalue-ссылку). Если вы точно знаете, что делает вызываемый метод (например, он написан вами), то ничего "небезопасного" или "непереносимого" в этом нет.
Ну понятно что не от самого std::move, а от конструктора перемещения или там присваивания с перемещением. Строгие формулировки мне с утра не удаются. Но что STL никаких гарантий касательно состояния объекта после перемещения не даёт кроме того что оно "valid" — факт. И сторонние библиотеки обычно не дают. А в своём коде конечно можно вообще семантику перемещения поменять как угодно, да вот только стоит ли?
Они же проверяют свой ког clang анализатором? Т.е это наглядно показывает что pvs находит больше или как минимум что то новое я правильно понял посыл статьи?)
Наверное, вот эта ссылка будет более понятной: https://bugs.llvm.org/showdependencytree.cgi?id=41655
Это весьма типовая ситуация, когда ошибка прячется в обработчике ошибок, так как их никто не тестирует.
Сильное утверждение =) Обработчики ошибок могут не тестироваться максимум в смоуке. Если при тестировании проверяется только корректное функционирование, то отдел тестирования не отрабатывает свою зарплату.
Отрабатывает или не отрабатывает — это вопрос вторичный. Весь опыт использования статических анализаторов говорит, что пути обработки ошибок тестируют заметно меньше, чем корректные пути работы программы. Для реальных багов, выявленных в коде обработки ошибок статическими анализаторами всегда существенно выше.
А вот кофейный расчудесен, не хватает его в календарике..!
«Подозрительный брейк» напоминает недавниее обсуждение тут с
switch (x) {
break; case Y: ...
break; case Z: ...
}
вероятно подобный код (сам по себе имхо хороший) был реформатирован, получилось уж как получилось :D
Неопределённое поведение
FeaturesMap[Op] = FeaturesMap.size();
Здесь нет неопределённого поведения. Здесь неспецифицированный порядок вычисления.
Находим баги в LLVM 8 с помощью анализатора PVS-Studio