Pull to refresh

Comments 17

Не хватает сравнения с эталонным Valgrind, хотя это и будет linux. Но Qt ведь подразумевает кросс платформу, так что логично предположить что вы собираете проект не только под Windows* (или не пользуетесь msvs).
Сам пользуюсь valgrind т.к. не используется msvs. Имхо будет похоже на vld только код трогать не надо.

Можно ещё попробовать Address Sanitizer (https://clang.llvm.org/docs/AddressSanitizer.html). Работает и в clang и в gcc. Вроде бы есть и в visual studio экспериментальная поддержка (https://devblogs.microsoft.com/cppblog/asan-for-windows-x64-and-debug-build-support/). Плюс в том, что ловит не только утечки памяти, но и прочие ошибки работы с ней, например использование освобождённой памяти или выход за границы буфера.

Пользовался Valgrid из-под Qt Creator для небольшого проекта (ОС Kubuntu), и по ощущениям Valgrid замедлял работу приложения в 50 и более раз — что для проверки памяти, что для профилирования (это в Debug, но в конфигурации Profile тоже существенно). Здесь по скорости VLD значительно выигрывает — с замедлением менее, чем в 2 раза в Debug.
Профилировать имхо удобно как раз через встроенную утилиту в msvs. Valgrind на больших проектах вероятно вообще невозможно использовать.

Не хватает обзора стандартного средства поиска утечек памяти из Visual Studio
https://docs.microsoft.com/ru-ru/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2019


Неплохо бы осветить еще один аспект — можно ли искать утечки, если часть программы представлена в виде собранной библиотеки, а не исходного кода.

Спасибо за интересную публикацию. Да, я и сам отмечал в статье, что статические анализаторы явно проигрывают динамическим в поиске утечек памяти. Жаль, что на данном проекте PVS-Studio проиграл совсем уж всухую :). А можно познакомиться с примерами найденных ошибок? Интересно посмотреть, можно ли будет подтянуть анализатор для выявления хотя бы части утечек. Если код приватен, то можно переместиться в почту. А можно здесь пообсуждать разные случаи. На ваше усмотрение и заранее спасибо.

P.S. И так уж получилось, что вчера я тоже опубликовал статью, касающуюся Qt 6. Статья хорошо показывает, что хоть с утечками и не очень, зато других ошибок можно найти на любой вкус и цвет. :) Приглашаю читателей: Обработка дат притягивает ошибки или 77 дефектов в Qt 6.

Напомните пожалуйста: есть ли в PVS поддержка/интеграция с Qt?
(какие-нибудь особые правила; что-то наподобие clazy)

QtCreator умеет открывать отчёты анализатора в формате TaskList. Специальных плагинов пока нет. В плане анализа много диагностик прокачены для поиска специфичных ошибок для Qt. Cходу могу вспомнить только QString, но там много разных классов.
В плане анализа много диагностик прокачены для поиска специфичных ошибок для Qt.

Спасибо за инфу.

Спасибо за приглашение, у Вас всегда интересные статьи.
Вас интересуют примеры утечек или примеры того, что обнаружил продукт PVS-Studio?
Основная причина того, что PVS-Studio не смог найти утечки в Qt-приложении, кроется в самом Qt и в его иерархиях наследования. Дело в том, что все базовые классы Qt (QObject, QWidget) уже содержат виртуальный деструктор, и потому ошибка программиста здесь исключена. Как я понимаю, именно отлов деструктора, не являющегося виртуальным, для базовых классов, является самом ключевым элементом в PVS-Studio для поиска утечек. И вот как раз он объективно не мог сработать.
Интересуют примеры утечек, которые не видит PVS-Studio. Впрочем, по описанию, подозреваю, что и не получится. :)
примеры в статье приведены. наиболее жизненный и типичный пример — пример 3 (создание объекта и невключение его в иерархию Qt)
Добавлю, что delete для наследников от QObject лучше не вызывать, для ручного удаления таких объектов есть метод deleteLater
Да, я и сам отмечал в статье, что статические анализаторы явно проигрывают динамическим в поиске утечек памяти.

Расскажите это расту.

Интересный результат! Правда моя практика наоборот склонила к встроенному в VS механизму со снимками памяти. Для моего проекта инструмент оказался самым надежным, в то время как Intel Inspector в принципе отказывался работать, да и памяти потреблял настолько много, что не всегда даже стартовал.
Есть еще Deleaker, у него из особенностей — возможность делать такие же снимки для GDI объеков.
Я правильно понимаю, что
int* array = nullptr;
for (int i = 0; i < 5; i++)
{
	array = new int[10];
}
delete[] array;

эквивалентно

int* array =new int[10];
int* array =new int[10];
int* array =new int[10];
int* array =new int[10];
int* array =new int[10];

и каждый раз будет выделена разная память? И компилятор на такое не ругается?
И можно даже так?

int* a =new int;
int* a =new int;
int* a =new int;
int* a =new int;
int* a =new int;

И валидный будет только последний адрес?
Sign up to leave a comment.

Articles