Russian Qt Forum
Апрель 27, 2024, 23:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 ... 5   Вниз
  Печать  
Автор Тема: valgrind  (Прочитано 30607 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Декабрь 16, 2014, 11:07 »

Привет, друзья!
Поставил себе чудо утилиту valgrind. Только не понял, как этим чудом пользоваться.
Произвёл в креаторе запуск и получил
Цитировать
Conditional jump or move depends on uninitialised value(s)
  в Positioner::repackElementsByVolumes(QVector<int> const&, QVector<int> const&) в positioner.cpp:1337
Код, на который идет ссылка:
Код
C++ (Qt)
   const int* depend = depends.constData(),
            * dependEnd = depend + depends.size();
 
   int nVolumes = volumes.size();
 
   // в вектор записывается пара объём - количество повторений подряд
   QVector< QPair<int, int> > valueMap;
   valueMap.reserve(nVolumes);
 
   int lastVol = -1;
   while (depend != dependEnd)
   {
       int count = 0;
       while(lastVol == *depend && depend != dependEnd)
       {
           ++count;
           ++depend;
       }
       valueMap << QPair<int, int> (lastVol, count);
       lastVol = *depend;
   }
 
Участок считает количество подряд идущих значений в векторе.
В упор не вижу ошибки. Ссылка идет на while(lastVol == *depend && depend != dependEnd).
На сколько правильно пользоваться валгриндом из-под креатора?
В качестве обучения я нашёл только 1 книгу на английском и кучу статей. Так понимаю, что хороших русскоязычных источников нет?
Чем полезно профилирование? Так и не понял...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 16, 2014, 11:12 »

Ищи утечки памяти по ключевому слову definitely.
А так, да, литература только на английском. На хабре было несколько статей, поищи. Или клочки инфы по форумам.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Декабрь 16, 2014, 11:17 »

А на сколько этот инструмент популярен в промышленном программировании?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 16, 2014, 11:26 »

Достаточно популярен. Я аналогов свободных не знаю.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Декабрь 16, 2014, 11:29 »

Код
C++ (Qt)
   const int* depend = depends.constData(),
   while (depend != dependEnd)
   {
       int count = 0;
       while(lastVol == *depend && depend != dependEnd)
       {
           ++count;
           ++depend;
       }
       valueMap << QPair<int, int> (lastVol, count);
       lastVol = *depend;
   }
 

Ну видно же, что на последней итерации, когда depend == dependEnd, где dependEnd указывает за последний элемент массива, lastVol = *depend будет читать левые данные.

Я valgrind использую часто, альтернатив нет, даже когда целевая платформа - винда (собираю в линуксе и прогоняю валгриндом). Под винду тоже искал что-то похожее, но там мрак. Есть  от интела Inspector XE, но он такой неочевидный, тормозит при анализе еще похлеще valgrind и кажется стоит денег.
« Последнее редактирование: Декабрь 16, 2014, 11:34 от navrocky » Записан

Гугль в помощь
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Декабрь 16, 2014, 11:40 »

Ну видно же, что на последней итерации, когда depend == dependEnd, где dependEnd указывает за последний элемент массива, lastVol = *depend будет читать левые данные.
Ну, меня в последствии не интересует lastVol. То есть он на lastVol ругался в том выражении...
И что теперь? Добавляем ситуацию в исключение и забываем?

Кстати, раз уж о проверке кода, на сколько нужны всяческие проверялки типа разрекламированной pvs?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Декабрь 16, 2014, 11:49 »

Я юзаю cppcheck иногда, pvs не трогал.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #7 : Декабрь 16, 2014, 11:51 »

Ну видно же, что на последней итерации, когда depend == dependEnd, где dependEnd указывает за последний элемент массива, lastVol = *depend будет читать левые данные.
Ну, меня в последствии не интересует lastVol. То есть он на lastVol ругался в том выражении...
И что теперь? Добавляем ситуацию в исключение и забываем?

Кстати, раз уж о проверке кода, на сколько нужны всяческие проверялки типа разрекламированной pvs?
Я думаю, они помогают. PVS, правда, анально огорожена, работает только с микрософтовским компилятором. Анализатор у неё, судя по всему, наиболее умный. Можешь попробовать триал погонять. Есть cppcheck - но он вообще ничего сложного не видит, показывает только очень простые и очевидные вещи.
Записан

Гугль в помощь
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Декабрь 16, 2014, 11:56 »

есть еще какие то тулзы гугловские, но походу они только с clang работают.
валгриндом прогоняю периодически, но честно говоря он много выдает мусора из загруженных библиотек (ругается как на кутешные так и на нативные линуксовые либы).
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Декабрь 16, 2014, 12:05 »

есть еще какие то тулзы гугловские, но походу они только с clang работают.
валгриндом прогоняю периодически, но честно говоря он много выдает мусора из загруженных библиотек (ругается как на кутешные так и на нативные линуксовые либы).
На Кьютовые можно фильтр установить, как и на другие.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Декабрь 16, 2014, 12:05 »

Ну видно же, что на последней итерации, когда depend == dependEnd, где dependEnd указывает за последний элемент массива, lastVol = *depend будет читать левые данные.
Ну, меня в последствии не интересует lastVol. То есть он на lastVol ругался в том выражении...
И что теперь? Добавляем ситуацию в исключение и забываем?

Кстати, раз уж о проверке кода, на сколько нужны всяческие проверялки типа разрекламированной pvs?
Я думаю, они помогают. PVS, правда, анально огорожена, работает только с микрософтовским компилятором. Анализатор у неё, судя по всему, наиболее умный. Можешь попробовать триал погонять. Есть cppcheck - но он вообще ничего сложного не видит, показывает только очень простые и очевидные вещи.

На сколько я помню, они добавляли другие компили.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #11 : Декабрь 16, 2014, 12:06 »

валгриндом прогоняю периодически, но честно говоря он много выдает мусора из загруженных библиотек (ругается как на кутешные так и на нативные линуксовые либы).
Так понимаю, что эти ошибки можно занести в исключения и при повторной проверке ловить реальные, свои ошибки.

А ещё я не совсем понял, каким образом происходит анализ. Мне необходимо протыкать все возможности моей программы? Чтобы она залезла в каждую веточку?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Декабрь 16, 2014, 12:39 »

В упор не вижу ошибки. Ссылка идет на while(lastVol == *depend && depend != dependEnd).
Лучше переставить условия, т.к. *depend читает ячейку за границами вектора (и, возможно, доступной памяти). Также не ловите "хвост". Напр depend == dependEnd), count = 0, а Вы все равно добавляете пару.

Лучше чуть поступиться оптимальностью, но упростить код, напр
Код
C++ (Qt)
typedef QPair <int, int> TPair;
QVector <TPair> valueMap;
valueMap.push_back(TPair(depends[0], 1));
 
for (int i = 1; i < depends.size(); ++i) {
if (depends[i] == depends[i - 1])
 ++valueMap.back().second;
else
 valueMap.push_back(TPair(depends[i], 1));
}
 
« Последнее редактирование: Декабрь 16, 2014, 12:41 от Igors » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #13 : Декабрь 16, 2014, 13:00 »

Спасибо.
Попробовал cppcheck - понравилась.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Декабрь 16, 2014, 13:03 »

Спасибо.
Попробовал cppcheck - понравилась.
Она не очень много показывает. Вообще, лучшая связка:
1. Включить максимально ворнинги при компиляции и все фиксить.
2. Собирать clang.
3. Пробегать периодически cppcheck.
4. Вставлять всякие проверки (ассерты).
5. Писать чистый кот.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 22.