Доверять ли valgrind

Автор mihail_1, 14 мая 2013, 20:06:09

« назад - далее »

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

mihail_1

В программе после уменьшения во много раз размера массива, забыл уменьшить количество инициализируемых элементов массива, в результате повреждались другие данные и все работало не так. Первое что я сделал увидев странное поведение программы - запустил ее под valgrind. Ошибок он не обнаружил. Когда я уже вручную нашел ошибку я не исправляя еще раз запустил программу под valgrind - опять ни одного сообщения от него. Зачем тогда нужен valgrind если не ловит явный выход индекса за границу массива?

Olej

Цитата: mihail_1 от 14 мая 2013, 20:06:09Зачем тогда нужен valgrind если не ловит явный выход индекса за границу массива?
valgrind, насколько я помню, контролирует утечки памяти (что гораздо хуже вашего случая), у вас же просто накрывается массивом следующие по размещению переменные... т.е., по крайней мере, никакой некоррекетности в выделении/освобождении памяти не происходит.
 

mihail_1

А чем проверять выходы за границу массива?

Olej

Цитата: mihail_1 от 16 мая 2013, 00:47:24
А чем проверять выходы за границу массива?
Это достаточно неоднозначный вопрос: в C нет массивов, а есть указатели на начало массивов - при этом "границы массива" становятся достаточно бессмысленным понятием.
Используйте какие-то другие структуры данных ... например из STL в C++.



Olej

Цитата: gardarea51 от 16 мая 2013, 11:51:30
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

valgrind --tool=exp-sgcheck это умеет
но то ли не у меня, толи чего-то не доустановил
valgrind: failed to start tool 'exp-sgcheck' for platform 'amd64-linux': No such file or directory

dimamaster

#7
Спасибо за консультацию. Приглашаю на виртуальную прогулку по городу Джалал-Абад по реке Валира и острову Фонуалеиа также по Северной столице России Санкт-Петербург