Автор Тема: Доверять ли valgrind  (Прочитано 2733 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Доверять ли valgrind
« : 14 Мая 2013, 20:06:09 »
В программе после уменьшения во много раз размера массива, забыл уменьшить количество инициализируемых элементов массива, в результате повреждались другие данные и все работало не так. Первое что я сделал увидев странное поведение программы - запустил ее под valgrind. Ошибок он не обнаружил. Когда я уже вручную нашел ошибку я не исправляя еще раз запустил программу под valgrind - опять ни одного сообщения от него. Зачем тогда нужен valgrind если не ловит явный выход индекса за границу массива?
 

Оффлайн Olej

Re: Доверять ли valgrind
« Ответ #1 : 15 Мая 2013, 23:18:20 »
Зачем тогда нужен valgrind если не ловит явный выход индекса за границу массива?
valgrind, насколько я помню, контролирует утечки памяти (что гораздо хуже вашего случая), у вас же просто накрывается массивом следующие по размещению переменные... т.е., по крайней мере, никакой некоррекетности в выделении/освобождении памяти не происходит.
 
 

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Re: Доверять ли valgrind
« Ответ #2 : 16 Мая 2013, 00:47:24 »
А чем проверять выходы за границу массива?
 

Оффлайн Olej

Re: Доверять ли valgrind
« Ответ #3 : 16 Мая 2013, 01:30:25 »
А чем проверять выходы за границу массива?
Это достаточно неоднозначный вопрос: в C нет массивов, а есть указатели на начало массивов - при этом "границы массива" становятся достаточно бессмысленным понятием.
Используйте какие-то другие структуры данных ... например из STL в C++.

 

Оффлайн gardarea51

 

Оффлайн Olej

Re: Доверять ли valgrind
« Ответ #5 : 16 Мая 2013, 16:00:17 »
http://ru.wikipedia.org/wiki/Valgrind#.D0.9E.D0.B3.D1.80.D0.B0.D0.BD.D0.B8.D1.87.D0.B5.D0.BD.D0.B8.D1.8F_Memcheck

Там же и написано:
Цитировать
Помимо ограничения производительности, существенным ограничением Memcheck является его неспособность обнаруживать граничные ошибки при использовании статических или помещенных в стек данных. Нижеследующий код успешно пройдет проверку Memcheck без каких-либо предупреждений, невзирая на указанные ошибки:
Это и есть окончательный ответ (приговор ;D) на первоначально поставленный вопрос: никак Valgrind вам не поможет диагностировать выход за пределы массива, если этот массив статический (глобальный, в секции .data) или локальный (в стеке, внутри функции ... даже если это функция main ;) + несколько уровней вложенных вызовов). А это и есть именно то, что вас интересовало, как я понимаю?
Valgrind (его инструменты) поможет только с областями (массивами тоже) выделяемыми динамически: malloc(), calloc() ... возможно alloca(), но тут я сомневаюсь.
 

Оффлайн mihail_1

  • Местный житель
  • ***
  • Сообщений: 169
Re: Доверять ли valgrind
« Ответ #6 : 16 Мая 2013, 17:49:13 »
valgrind --tool=exp-sgcheck это умеет
но то ли не у меня, толи чего-то не доустановил
valgrind: failed to start tool 'exp-sgcheck' for platform 'amd64-linux': No such file or directory
 

Оффлайн dimamaster

  • Новичок форума
  • Сообщений: 1
Re: Доверять ли valgrind
« Ответ #7 : 05 Сентября 2013, 10:24:26 »
Спасибо за консультацию. Приглашаю на виртуальную прогулку по городу Джалал-Абад по реке Валира и острову Фонуалеиа также по Северной столице России Санкт-Петербург
« Последнее редактирование: 17 Сентября 2013, 15:03:31 от dimamaster »
 

Теги: