Проблема с указателем C: он теряет адресную информацию при возврате из функции - PullRequest
2 голосов
/ 08 декабря 2010

У меня есть некоторый C-код, где указатель размещается и возвращается в функцию родительского вызывающего / родительского. Используя GDB, я заметил, что распределение указателей в порядке, но когда я его возвращаю, он теряет старшие биты первых четырех байтов адреса. В основном это выглядит так:

allocate pointer A
allocate pointer B
Free A
Return B

Теперь, если я изменю это на:

allocate pointer B
allocate pointer A
Free A
Return B

Все работает отлично. Что странно, так это то, что этот код работал отлично в течение 5+ лет, и теперь он доставляет нам проблемы в некоторых очень специфических случаях. Нас беспокоит то, что адрес изменился, мы не смогли обнаружить эту ошибку каким-либо другим способом, только когда мы подключили gdb и начали осматриваться, мы увидели изменение.

Кто-нибудь здесь видел нечто подобное или знает, почему это происходит? Кстати, мы не пытаемся записать больше, чем мы можем обработать в A или B, оба буфера имеют правильный размер для данных.

Заранее спасибо за любую подсказку.

Ответы [ 3 ]

3 голосов
/ 08 декабря 2010

Пахнет, как будто вы не объявили прототип вашей функции. Это было хорошо в течение многих лет на 32-битных машинах, где int и void* имеют одинаковую ширину. В настоящее время они разные, и вы теряете свои старшие байты.

Вы компилируете с -Wall или что-то в этом роде, я полагаю?

1 голос
/ 08 декабря 2010

Это может быть связано со многими причинами, переполнением буферов, ограниченным пространством кучи и т. Д. Размещение кода поможет!

0 голосов
/ 08 декабря 2010

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

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