Может ли повреждение памяти быть вызвано неправильным * чтением * освобожденной памяти? - PullRequest
2 голосов
/ 03 июля 2010

Я получаю

*** обнаружен glibc *** (/ my / program / ...): malloc (): повреждение памяти: 0xf28000fa ***

Я работал под valgrind, который сообщает о случаях чтения памяти, которая была освобождена, но нет случаев недопустимой памяти пишет .

Может ли чтение освобожденной памяти вызвать повреждение памяти? Если нет, какие-нибудь предложения, где еще смотреть за пределы выхода valgrind?

Ответы [ 6 ]

5 голосов
/ 03 июля 2010

Вы можете использовать GDB для просмотра каждой записи в этом адресе памяти, например:

(gdb) watch *((int*)0xf28000fa)

Затем вы можете отладить, где проблема.

Чтение не вызывает повреждение памяти, но есть множество ситуаций, которые вы даже не представляете, что могли бы быть причиной этого, и Valgrind не является идеальным инструментом.*.

2 голосов
/ 03 июля 2010

Это не испортит память, которую вы читаете, но не собирается творить чудеса с работой вашей программы.

1 голос
/ 03 июля 2010

Это не должно быть так распространено на современных процессорах, но я работал на платформах, где даже операция чтения может творить чудеса. В конкретном процессоре 6502 был назначен ввод-вывод, поэтому обычная команда «чтения» с адресом ввода-вывода может делать удивительные вещи.

Около 30 лет назад меня это укусило, потому что мое плохое чтение спровоцировало переключение банка памяти (то есть каждый байт памяти, включая область, содержащую код, получил новое значение сразу после этой инструкции). Самое смешное, что это не было действительно «непреднамеренное» плохое чтение ... Я действительно читал, даже зная, что это будет мусор, потому что это спасло меня от нескольких инструкций ассемблера ... не умный ход.

1 голос
/ 03 июля 2010

Нет, чтение неверных местоположений не может вызвать ошибку, которую вы видите. Если местоположение корректно в вашем адресном пространстве, вы просто будете читать ненужную информацию, а если нет, то получите ошибку сегментации.

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

1 голос
/ 03 июля 2010

Чтение освобожденной памяти также считается повреждением памяти.

Вы также можете проверить http://en.wikipedia.org/wiki/Memory_corruption.

0 голосов
/ 03 июля 2010

Что действительно может случиться, так это то, что free может использовать системный вызов madvise (MADV_DONTNEED), чтобы сообщить ядру «Мне не нужна эта страница, отбросьте ее» (см. Man-страницу madvise (2)). Если эта страница действительно освобождается, и вы что-то читаете с нее, ядро ​​тихо предоставит новую страницу, обнуленную - и, таким образом, приложение столкнется с совершенно неожиданными данными!

...