Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка указателей на валидность 
:(
    Опции темы
Sergio
  Дата 5.11.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: 0
Всего: 1



Здраствуйте. Как проверить указатель на валидность? Проверять на NULL или еще есть способы?
Заранее спасибо.
PM MAIL ICQ   Вверх
MAKCim
Дата 5.11.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Sergio
все зависит от того, какие в твоем случае критерии валидного указателя
в общем случае проверить валидность средствами языка нельзя
должна быть поддержка со стороны API ОС
однако если указатель нулевой, то с большой вероятностью он не валиден


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Sergio
  Дата 5.11.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: 0
Всего: 1



А переменные типа int лучше инициализировать 0 или NULL?

Это сообщение отредактировал(а) Sergio - 5.11.2007, 17:37
PM MAIL ICQ   Вверх
Alexeis
Дата 5.11.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(MAKCim @  5.11.2007,  16:47 Найти цитируемый пост)
однако если указатель нулевой, то с большой вероятностью он не валиден 

  Нечетные указатели обычно неверные, они могут быть верными только если это указатель на элемент массива или указали нестандартное выравнивание.

Добавлено через 6 минут и 46 секунд
  Обычно это связанно с 32х разрядными регистрами процессора и выполняется с целью оптимизации. В месте с тем если это какой-нибудь контроллер, то это может быть неверным. А вот скажем на процессорах типа ARM, вообще не удасться адресовать нечетный адрес, возможно из-за того, что них нельзя обратиться к половинке/четвертинке регистра типа как eax/ax/al/ah


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 5.11.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Alexeis
при чем здесь 32-ух разрядные регистры?
они вполне могут хранить адрес, не кратный степени двойки
Цитата(Alexeis @  5.11.2007,  18:19 Найти цитируемый пост)
не удасться адресовать нечетный адрес, возможно из-за того, что них нельзя обратиться к половинке/четвертинке регистра типа как eax/ax/al/ah 

как одно связано с другим?
нулевой разряд регистра не может быть единичным?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 5.11.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



_CrtIsValidPointer посмотри


--------------------
user posted image    user posted image
PM MAIL   Вверх
Alexeis
Дата 5.11.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



MAKCim, представь что предыдущая структура имела нечетную длину, например заканчивается байтом. За ней начинается новая структура. Если прочитать этот байт как DWORD, то автоматом захватим еще кусок соседней структуры. Если мы можем использовать четвертинку регистра, то это нам позволит прочитать только 1 байт и получить верное значение в регистре, а если нет, то единственная возможность прочитать правильное значение, это производить несколько битовых операций. Компилятор сразу отбрасывает использование битовых операций, как неэффективное средство доступа к памяти, потому все структуры и объекты выравниваются на границу 4х байт. Если объявляется сначала переменная в байт, а затем скажем DWORD, то вместо байта компилятор выделит тоже DWORD, т.о. почти всегда адреса получается четными. 
  Для процессоров i486 совместимых обычно делается тоже самое, но в целях оптимизации по скорости.

MAKCim, можешь глянуть под дебагом адреса и проверить.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 5.11.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Sergio @  5.11.2007,  16:31 Найти цитируемый пост)
Как проверить указатель на валидность?

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 5.11.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Alek86 @  5.11.2007,  19:11 Найти цитируемый пост)
_CrtIsValidPointer посмотри 

Цитата(http://msdn2.microsoft.com/en-us/library/0w1ekd5e(VS.80).aspx)

Verifies that a specified memory range is valid for reading and writing (debug version only).



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alek86
Дата 5.11.2007, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Alexeis @  5.11.2007,  20:53 Найти цитируемый пост)
(debug version only)

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

или всеми любимый boost::shared_ptr (хотя все еще не знаю, насколько он тормозит программу smile )


Это сообщение отредактировал(а) Alek86 - 5.11.2007, 21:18


--------------------
user posted image    user posted image
PM MAIL   Вверх
MAKCim
Дата 5.11.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alexeis @  5.11.2007,  20:51 Найти цитируемый пост)
то это нам позволит прочитать только 1 байт и получить верное значение в регистре, а если нет, то единственная возможность прочитать правильное значение, это производить несколько битовых операций

Код

movzx eax, byte ptr [eax]

Цитата(Alexeis @  5.11.2007,  20:51 Найти цитируемый пост)
Компилятор сразу отбрасывает использование битовых операций, как неэффективное средство доступа к памяти, потому все структуры и объекты выравниваются на границу 4х байт

битовые операции и доступ к памяти никак не связаны
Код

mov eax, dword ptr [eax]
and eax, 0xFF ; нет memory-операнда

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

Это сообщение отредактировал(а) MAKCim - 5.11.2007, 21:37


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Lazin
Дата 5.11.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Есть еще такие функции IsBadWritePtr IsBadReadPtr, _CrtIsValidPointer видимо на их основе построена
PM MAIL Skype GTalk   Вверх
Alexeis
Дата 5.11.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



MAKCim, а как тогда объяснить причину ошибки "Data Type Misalignment", которая возникает при попытке обратиться по нечетному адресу и при включении директивы  pragma pack(0) Значит так оптимальнее или еще по чему. Мож гляуть в хелп.

Добавлено через 6 минут и 3 секунды
Цитата(MAKCim @  5.11.2007,  21:36 Найти цитируемый пост)
битовые операции и доступ к памяти никак не связаны

  Я имел ввиду, что для того чтобы считать значение нужно производить битовую операцию. Это дольше чем просто обратиться! 

Цитата(MAKCim @  5.11.2007,  21:36 Найти цитируемый пост)
movzx eax, byte ptr [eax]

С массивами я же говорил все ок. Видимо так он и делает. Для элементов массивов можно использовать нечетные.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DominiK
Дата 6.11.2007, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 11.3.2007
Где: Россия, Омск

Репутация: нет
Всего: нет



Цитата(Sergio @ 5.11.2007,  17:37)
А переменные типа int лучше инициализировать 0 или NULL?

Разницы нету.
PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(DominiK @  6.11.2007,  00:24 Найти цитируемый пост)
Разницы нету. 

Зависит от того Си это или Си++.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 6.11.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alexeis @  5.11.2007,  23:54 Найти цитируемый пост)
а как тогда объяснить причину ошибки "Data Type Misalignment", которая возникает при попытке обратиться по нечетному адресу и при включении директивы  pragma pack(0) Значит так оптимальнее или еще по чему. Мож гляуть в хелп.

установка AM в CR0 и AC в EFLAGS включает генерацию #AC (Alignment Check) в случае обращения по невыровненным адресам
но это никак не связано с оптимизацией
обработка исключительной ситуации на уровне процессора куда менее эффективное средство для достижения оптимального результата
 
Цитата(Alexeis @  5.11.2007,  23:54 Найти цитируемый пост)
С массивами я же говорил все ок. Видимо так он и делает. Для элементов массивов можно использовать нечетные.

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 6.11.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(MAKCim @  6.11.2007,  10:10 Найти цитируемый пост)
установка AM в CR0 и AC в EFLAGS включает генерацию #AC (Alignment Check) в случае обращения по невыровненным адресам
но это никак не связано с оптимизацией
обработка исключительной ситуации на уровне процессора куда менее эффективное средство для достижения оптимального результата

  Почему? Разве эффективнее делать 10 проверок чем одну обработку исключения?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 6.11.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alexeis @  6.11.2007,  10:34 Найти цитируемый пост)
Почему? Разве эффективнее делать 10 проверок чем одну обработку исключения? 

хорошо
а как ты отличишь обращение к элементу массива от, например, обращения к полю структуры?
каждый раз компилятор вынужден будет встявлять куски кода по установке и сбросу AC
это более эффективно?

Это сообщение отредактировал(а) MAKCim - 6.11.2007, 10:58


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 6.11.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



MAKCim, ну мой текущий компилятор это как-то делает, хотя у меня создается впечатление, что для массивов он использует другую схему обращения при этом избегает нечетных адресов. 
Цитата(MAKCim @  6.11.2007,  10:57 Найти цитируемый пост)
хорошо
а как ты отличишь обращение к элементу массива от, например, обращения к полю структуры?

  Думаю он использует для этого разные команды.

  По крайней мере с вероятностью 50/50 можно определить, то что указатель невалидный. Чем раньше об этом узнаешь тем ближе окажешься к источнику ошибки. Так что положительный момент в этом есть. Вот только я не уверен, можно ли организовать такую же схему для i486.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 6.11.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  6.11.2007,  11:21 Найти цитируемый пост)
MAKCim, ну мой текущий компилятор это как-то делает

Дельфи? IIRC, он программно полностью контролирует доступ к памяти(в дебаге).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 6.11.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



archimed7592, я сейчас говорю про eVC.

Добавлено @ 11:46
Мы же в разделе С++. С чего бы тут обсуждать компилятор Делфи...
[оффтоп]У делфей такие проблемы возникают намного реже, так как там строки/массивы/интерфейсы это управляемая память. Зря напомнили  smile , ща как разведу оффтопа[/оффтоп]


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 6.11.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alexeis @  6.11.2007,  11:21 Найти цитируемый пост)
Думаю он использует для этого разные команды.

 smile 
не в команде дело
если у нее есть адресный операнд, то в любом случае существует возможность исключения
если чтение/запись массива выполняется по выровненным адресам, то тогда требуются дополнительные телодвижения для того, чтобы прочитать/записать данные
а ты вроде сам писал
Цитата(Alexeis @  5.11.2007,  23:54 Найти цитируемый пост)
Я имел ввиду, что для того чтобы считать значение нужно производить битовую операцию. Это дольше чем просто обратиться! 

где оптимизация?  smile 



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 6.11.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 6.11.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Alexeis @  6.11.2007,  11:57 Найти цитируемый пост)
Если хош могу показать кусок асма. Ща попробую

давай


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  6.11.2007,  11:57 Найти цитируемый пост)
Читал, что выравнивание делается в целях оптимизации.

Не только, особенно, если речь про eVC - многие архитектуры не поддерживают обращение по невыровненому адресу.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 6.11.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Код

596:      byte *b = new byte[50];

1205630A   mov       r0, #50
1205630C   bl        |CreateStaticMapping+18h (1208a930)|
12056310   str       r0, [sp, #0x48]
12056312   ldr       r1, [sp, #0x48]
12056314   str       r1, [sp, #0x20]
12056316   ldr       r0, [sp, #0x20]
12056318   str       r0, [sp, #0x18]

597:      b[1] = 4;

1205631A   ldr       r0, [sp, #0x18]
1205631C   mov       r1, #4
1205631E   strb      r1, [r0, #1]

598:      b[2] = 4;

12056320   ldr       r2, [sp, #0x18]
12056322   mov       r0, #4
12056324   strb      r0, [r2, #2]




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 6.11.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Alexeis
Цитата(Alexeis @  6.11.2007,  12:29 Найти цитируемый пост)
1205630A   mov       r0, #50
1205630C   bl        |CreateStaticMapping+18h (1208a930)|
12056310   str       r0, [sp, #0x48]

неизвестно, какое значение в r0 после bl
поэтому неизвестно, какой адрес получается в этом месте (r0 + 1)
Цитата(Alexeis @  6.11.2007,  12:29 Найти цитируемый пост)
1205631E   strb      r1, [r0, #1]

и в этом
Цитата(Alexeis @  6.11.2007,  12:29 Найти цитируемый пост)
12056324   strb      r0, [r2, #2]

в не зависимости от базового адреса массива x
из двух адресов x + 1 и x + 2 по определению как минимум один из них - не кратен 4-м
Добавлено @ 12:49
Alexeis
ассемблер похож на MIPS
оно?

Это сообщение отредактировал(а) MAKCim - 6.11.2007, 12:54


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
pompei
Дата 6.11.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Как видишь проверка указателя на валидность очень сложная задача. А раз так то постарайтся поступить по простому, постарайся избежать её. Например с помощью такого метода: прими что = 0 (NULL) - это инвалидный указатель, остальные валидные. Тогда получается необходимо всегда писать так:
Код


// Берём ресурсы
MY_STRU *my_pointer = malloc( размер );
if (my_pointer == NULL) { // по спецификации malloc возвращает NULL в случае ошибки
  perror( "А-а-а-а-а-а" );
  exit( 1 );
}

//освобождаем ресурс
if (my_pointer != NULL) {
  free( my_pointer );
  my_pointer = NULL; // чтобы указать что он инвалидный
}

// работаем с указателем
if (my_pointer == NULL) {
  //указатель инвалидный
} else {
  // пользуемся валидным указателем
  my_pointer->...
}



--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
Lazin
Дата 6.11.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(pompei @  6.11.2007,  13:56 Найти цитируемый пост)
прими что = 0 (NULL) - это инвалидный указатель, остальные валидные

это неверно, если указатель не равен 0, это не значит что он валидный, указатель может указывать неизвестно куда, например в адресное пространство другого процесса. Я уже писал, что есть функции для проверки, указывает ли указатель на область памяти в куче или хрен знает куда (IsBadWritePtr IsBadReadPtr, итд, смотри MSDN). Но даже если он указывает на объект в куче, это еще не значит что он правильный, так как может указывать на уже удаленный объект.
Обычно указатели инициализируют 0, и после удаления объекта обнуляют указатель, чтобы по значению указателя можно было узнать указывает ли он на объект или нет.
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 6.11.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



есть решение под Linux (но немного извращенное) 
Код

int is_valid_pointer(void * address) {
    size_t size = (size_t)getpagesize();
    unsigned long pointer = (unsigned long)address;
    void * handle;
    if ((handle = mmap((void*)(pointer - ponter % size), size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS, -1, 0)) == MAP_FAILED)
        return 0;
    munmap(handle, size);
    return 1;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 6.11.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(MAKCim @  6.11.2007,  12:48 Найти цитируемый пост)
в не зависимости от базового адреса массива x
из двух адресов x + 1 и x + 2 по определению как минимум один из них - не кратен 4-м

  Я тоже так подумал. Да и дебагере можно прочитать с нечетного адреса прибавив к указателю на байт единицу и разъыменовав. При это все ок. Выходит, что проверка включается при обращении к структурам/массивам. 
p.s. я пропадаю на пару дней. Приеду гляну как происходит обращение к структуре. 

Цитата(MAKCim @  6.11.2007,  12:48 Найти цитируемый пост)
Alexeis, 
ассемблер похож на MIPS
оно?

Я не знаю что такое MIPS.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1947 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.