Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.13;
Скачать: CL | DM;

Вниз

Можно ли проверить указатель на корректность?   Найти похожие ветки 

 
SPeller ©   (2010-04-29 04:17) [0]

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


 
Рууки   (2010-04-29 06:03) [1]

type
 PMemoryManager = ^TMemoryManager;
 TMemoryManager = record
   GetMem: function(Size: Integer): Pointer;
   FreeMem: function(P: Pointer): Integer;
   ReallocMem: function(P: Pointer; Size: Integer): Pointer;
 end;

procedure GetMemoryManager(var MemMgr: TMemoryManager);
procedure SetMemoryManager(const MemMgr: TMemoryManager);
function IsMemoryManagerSet: Boolean;


Напиши свои функции работы с памятью, в которых веди список выделенных блоков памяти. Добавь к ним функцию проверки блока на "выделенность". В общем-то, для такого минимального функционала, работы и тестирования на пару часов.


 
SPeller ©   (2010-04-29 06:08) [2]

Надеялся что не надо заводить свою заглушку менеджера памяти :) Я просто не знаком с этой темой совсем, как работает МП не представляю, знаю только что он есть )


 
Рууки   (2010-04-29 06:28) [3]

Посмотреть реализацию менеджера памяти можно во включаемом файле getmem.inc.

Но получить доступ к выделенным блокам памяти можно. Правда, учитывая отсутствие в оригинале определения DEBUG_FUNCTIONS, придется перекопилировать System.pas:

{$IFDEF DEBUG_FUNCTIONS}
{ Inspector Query; implementation in GETMEM.INC; no need to conditionalize that }
 THeapBlock = record
   Start: Pointer;
   Size: Cardinal;
 end;

 THeapBlockArray = array of THeapBlock;
 TObjectArray = array of TObject;

function GetHeapBlocks: THeapBlockArray;
function FindObjects(AClass: TClass; FindDerived: Boolean): TObjectArray;
{ Inspector Query }
{$ENDIF}


 
Anatoly Podgoretsky ©   (2010-04-29 07:33) [4]

> SPeller  (29.04.2010 04:17:00)  [0]

Такого механизма не существует.


 
oxffff ©   (2010-04-29 09:49) [5]

Всегда есть нестандартные механизмы.


 
brother ©   (2010-04-29 09:54) [6]

> [5] oxffff ©   (29.04.10 09:49)
> Всегда есть нестандартные механизмы.


> Есть ли стандартные механизмы

?


 
oxffff ©   (2010-04-29 10:01) [7]


> brother ©   (29.04.10 09:54) [6]
> > [5] oxffff ©   (29.04.10 09:49)
> > Всегда есть нестандартные механизмы.
>
>
> > Есть ли стандартные механизмы
>
> ?


Формально ты прав. А по человечески? :)
Хочешь оставить автора темы без решения?


 
oxffff ©   (2010-04-29 10:04) [8]

Есть например стандартный способ. Написать Pierre le Riche,
чтобы он добавил такую функцию.


 
Плохиш ©   (2010-04-29 10:12) [9]


> SPeller ©   (29.04.10 04:17)
>
> Есть ли стандартные механизмы проверки некого указателя
> на корректность?

А смысл? Типa, у дерьмокодера левая рука не знает, что кодит правая? Или чаво вчера накодил сегодня забыл?


 
brother ©   (2010-04-29 10:16) [10]

> Хочешь оставить автора темы без решения?

так может он и сам может через "велосипед" решить?


 
Anatoly Podgoretsky ©   (2010-04-29 10:26) [11]

А может и без зарплаты останется, нам же подробности неизвестны.


 
Ins ©   (2010-04-29 11:05) [12]

В моем понимании корректный указатель это тот, который указывает на адрес где лежат ожидаемые тобой данные. В противном случае указатель некорректный. Так вот, для выявления таких корректных указателей механизма не то что не существует, его и не может существовать. Отсутствие AV и указание на реально выделенный блок не дает гарантии, что он уже не указывает на что-то другое


 
oxffff ©   (2010-04-29 11:13) [13]


> Ins ©   (29.04.10 11:05) [12]
> В моем понимании корректный указатель это тот, который указывает
> на адрес где лежат ожидаемые тобой данные. В противном случае
> указатель некорректный. Так вот, для выявления таких корректных
> указателей механизма не то что не существует, его и не может
> существовать


Хочешь сказать, что технически нельзя реализовать такой механизм?
А если рассмотреть указатель не как значение,а как некоторую функцию от этого значения?


 
Anatoly Podgoretsky ©   (2010-04-29 12:19) [14]

> Ins  (29.04.2010 11:05:12)  [12]

Не на ожидаемые, а на правильные, а то можно получить ожидаемыt, но не совсем те, поскольку возможна завязка Obj := Create, Free, Create. И даже без второго Create


 
Anatoly Podgoretsky ©   (2010-04-29 12:20) [15]

> oxffff  (29.04.2010 11:13:13)  [13]

Можно, но только для действительного указателя, а для не действительно обычно реализуешь AV и то если повезет, хуже если не повезет.


 
oxffff ©   (2010-04-29 12:37) [16]


> Anatoly Podgoretsky ©   (29.04.10 12:20) [15]
> > oxffff  (29.04.2010 11:13:13)  [13]
>
> Можно, но только для действительного указателя, а для не
> действительно обычно реализуешь AV и то если повезет, хуже
> если не повезет.


Моя мысль глубже, чем вы написали.
В таком подходе указатель представляет не адрес, а билет, по которому происходит доступ. А валидность билета проверяется функцией, которая возвращает ссылку на объект. При уничтожении объекта связанный с ним билет анулируется. При создании объекта на том же месте, билет будет другим. Поэтому проверить валидность можно.
Аналогия сеансовый ключ в windows NT.


 
Anatoly Podgoretsky ©   (2010-04-29 13:04) [17]

> oxffff  (29.04.2010 12:37:16)  [16]

Никто еще не смог придумать надежного механизма определения корректности указателей.


 
oxffff ©   (2010-04-29 14:16) [18]


> Anatoly Podgoretsky ©   (29.04.10 13:04) [17]
> > oxffff  (29.04.2010 12:37:16)  [16]
>
> Никто еще не смог придумать надежного механизма определения
> корректности указателей.


1. Читать умеем? У потребителя билет, по которому доступ осуществляется к объекту кучи.
2. Интересно, а как тогда работает сборщик мусора в управляемой куче. (Память аллокирована пока есть ссылка. Равно как и обратное есть корретная ссылка пока аллокирована память)?


 
Ins ©   (2010-04-29 14:43) [19]


> oxffff ©   (29.04.10 14:16) [18]


Предлагаешь автору в своей программе реализовать что-то похожее на автоматический уборщик мусора? Ну а я предлагаю аккуратно работать с указателями. За всю практику ни разу не возникала потребность проверить валидность указателя или ссылки. Что я делаю неправильно?


 
oxffff ©   (2010-04-29 14:52) [20]


> Ins ©   (29.04.10 14:43) [19]
>
> > oxffff ©   (29.04.10 14:16) [18]
>
>
> Предлагаешь автору в своей программе реализовать что-то
> похожее на автоматический уборщик мусора? Ну а я предлагаю
> аккуратно работать с указателями. За всю практику ни разу
> не возникала потребность проверить валидность указателя
> или ссылки. Что я делаю неправильно?


Утверждаешь без IMHO.


> Так вот, для выявления таких корректных указателей механизма
> не то что не существует, его и не может существовать.


 
Ins ©   (2010-04-29 15:00) [21]


> Утверждаешь без IMHO.


)))))))
Довожу до сведения, совершенно ВСЕ сказанное на любом форуме любым рядовым участником является IMHO. И да, от своих слов не отказываюсь.


 
b z   (2010-04-29 16:05) [22]


> рядовым участником
А не рядовым (кстати что это?) уже догма? :)


 
Rouse_ ©   (2010-04-29 16:21) [23]


> Например, что этот блок памяти выделен текущим менеджером
> памяти и при обращении к нему не будет AV?

IsBadReadPtr / IsBadWritePtr устроит? Ну или VirtualQuery()...


 
Ega23 ©   (2010-04-29 17:09) [24]

try..except - чем не проверка?


 
Anatoly Podgoretsky ©   (2010-04-29 20:02) [25]

> Ega23  (29.04.2010 17:09:24)  [24]

Не корректный указатель не обязан приводить к исключению


 
Игорь Шевченко ©   (2010-04-29 21:14) [26]

У венды есть такой способ, HeapValidate+HeapWalk для юзеровских функций и VirtualQuery для системных.


 
Демо ©   (2010-04-30 00:02) [27]


> Anatoly Podgoretsky ©   (29.04.10 12:19) [14]
> > Ins  (29.04.2010 11:05:12)  [12]Не на ожидаемые, а на
> правильные, а то можно получить ожидаемыt, но не совсем
> те, поскольку возможна завязка Obj := Create, Free, Create.
>  И даже без второго Create


Ссылки на экземпляры классов - это не указатели.


> А смысл? Типa, у дерьмокодера левая рука не знает, что кодит
> правая? Или чаво вчера накодил сегодня забыл?


Думаешь, ты всегда помнишь свой дерьмокод?


> SPeller ©   (29.04.10 04:17) 
> Есть ли стандартные механизмы проверки некого указателя
> на корректность? Например, что этот блок памяти выделен
> текущим менеджером памяти и при обращении к нему не будет
> AV?


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

Неэффективное решение, и работать будет только для явных выделений памяти, но рабочее.


 
Игорь Шевченко ©   (2010-04-30 00:15) [28]


> Ссылки на экземпляры классов - это не указатели.


почему ?


 
Плохиш ©   (2010-04-30 00:35) [29]


> Демо ©   (30.04.10 00:02) [27]

> Ссылки на экземпляры классов - это не указатели.

А что это?

> > А смысл? Типa, у дерьмокодера левая рука не знает, что
> кодит
> > правая? Или чаво вчера накодил сегодня забыл?
>
>
> Думаешь, ты всегда помнишь свой дерьмокод?

За много лет ни разу не потребовалось обсуждаемого сабжа. Что я делаю не так?


 
Демо ©   (2010-04-30 00:39) [30]


>  Что я делаю не так?


Всё.


> Игорь Шевченко ©   (30.04.10 00:15) [28]
> > Ссылки на экземпляры классов - это не указатели.почему
> ?


К указателям применима адресная арифметика, к ссылкам - нет, так как не имеет смысла.


 
Плохиш ©   (2010-04-30 00:44) [31]

Мая рыдалъ...


 
Игорь Шевченко ©   (2010-04-30 00:45) [32]


> К указателям применима адресная арифметика, к ссылкам -
> нет, так как не имеет смысла.


"Покажи нашему человеку со средним образованием, покажи ему твердый шанкр и спроси: "какой это шанкр - твердый или мягкий?" - он обязательно брякнет: "мягкий, конечно"; а покажи ему мягкий - так он и совсем растеряется. А там - нет. Там, может быть, не знают, сколько стоит "зверобой", но уж если шанкр мягкий, так он для каждого будет мягок и твердым его никто не назовет... "

С указателем все то же самое...


 
Демо ©   (2010-04-30 01:14) [33]


> Плохиш ©   (30.04.10 00:44) [31]
> Мая рыдалъ...


Не плачь.


 
Германн ©   (2010-04-30 01:16) [34]


> К указателям применима адресная арифметика, к ссылкам -
> нет

Какая-то жуткая смесь из Си, Паскаля и иже с ними.
Но тут ведь форум ДМ, ne"s pa?
И вопрос автора именно по Дельфи.


 
Демо ©   (2010-04-30 01:45) [35]


> И вопрос автора именно по Дельфи.


Задайся вопросом, может ли ссылка быть указателем на произвольный кусок памяти? А указатель?
Можно ли указатель на PChar увеличить на единицу? А ссылку на объект?


 
Германн ©   (2010-04-30 01:54) [36]


> Задайся вопросом, может ли ссылка быть указателем на произвольный
> кусок памяти?

А где в сабже упомянут термин "ссылка"?
А у отвечающих на форуме ДМ нет принципиальной разницы между ссылкой и указателем. Бо ни о какой "адресной арифметике" они знать не хотят.


 
Демо ©   (2010-04-30 09:08) [37]


> Германн ©   (30.04.10 01:54) [36]
>
> > Задайся вопросом, может ли ссылка быть указателем на произвольный
>
> > кусок памяти?
>
> А где в сабже упомянут термин "ссылка"?
> А у отвечающих на форуме ДМ нет принципиальной разницы между
> ссылкой и указателем. Бо ни о какой "адресной арифметике"
> они знать не хотят.


Вот именно!
Про ссылки вопроса не было-)

Некий указатель - расплывчато достаточно.


 
Игорь Шевченко ©   (2010-04-30 11:12) [38]

Демо ©   (30.04.10 01:45) [35]

Займись на досуге увеличением на единицу переменной типа Pointer
И скажи, что такое ссылка в терминах Object pascal


 
Демо ©   (2010-04-30 13:26) [39]


> Займись на досуге увеличением на единицу переменной типа
> Pointer


А в чём проблема?


> И скажи, что такое ссылка в терминах Object pascal


Лень самому напрягаться...

http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html

Ссылки (References)
Многие типы в Delphi фактически являются указателями, но притворяются простыми типами. Я называю такие типы ссылочными. Примерами таких типов являются динамические массивы, строки, объекты и интерфейсы. Все они являются указателями "под капотом" языка, но с некоторой дополнительной семантикой и часто со скрытым содержанием.

Динамические массивы (dynamic arrays)
Многомерные динамические массивы
Строки (Strings)
Объекты (Objects)
Интерфейсы (Interfaces)
Ссылочные параметры
Нетипизированные параметры
Что отличает ссылки (references) от указателей (pointers):

Ссылки неизменяемы. Вы не можете увеличить или уменьшить ссылку. Ссылки указывают на определённые структуры, но никогда не указывают в середину них, как, например, указатели на данные массива в примерах выше.
Ссылки не используют синтаксис указателей. Это скрывает тот факт, что они являются указателями, и делает их сложнее для понимания для тех, кто не знаком с этой темой (и поэтому люди делают с ними вещи, которых делать нельзя).
Не путайте такие ссылки со ссылочными типами (reference types) в C++. Они во многом отличаются.


 
Игорь Шевченко ©   (2010-04-30 15:52) [40]

Демо ©   (30.04.10 13:26) [39]


> http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html


Gunsmoker - это не object pascal language guide.


> > Займись на досуге увеличением на единицу переменной типа
>
> > Pointer
>
>
> А в чём проблема?



> К указателям применима адресная арифметика


У тебя тип Pointer поддерживает арифметику ?
или это тоже не указатель ?


 
Демо ©   (2010-04-30 16:20) [41]


> Игорь Шевченко ©   (30.04.10 15:52) [40]
> Демо ©   (30.04.10 13:26) [39]

> Gunsmoker - это не object pascal language guide.


Ну я и не говорил, что по нему нужно Delphi изучать.

По поводу остального позже напишу...


 
SPeller ©   (2010-05-04 02:02) [42]

Почему мне это нужно. Указатель передаю через параметр оконного сообщения (внутри процесса, ессно) в сообщении WM_USER + N, который указывает на структуру с данными (маршалинг). Программа моя в виде длл может загружаться в произвольное приложение. Окно создается моей дллкой в основном гуишном потоке. Так вот, нет абсолютно никакой гарантии, что чужое приложение не пошлет окну сообщение с таким же номером, и что оно передаст в wParam тоже неизвестно. Ситуэйшин редкий, согласен, но зачем испытывать судьбу. И вот тут, чтобы не было ненужных ошибок в будущем, я и хотел вставить проверочку на то, что указатель - это указатель на память и оттуда можно хотябы читать. Поскольку структуры, которые я передаю, используются для маршалинга ком вызовов, то тут алгоритмы, снижающие быстродействие, применять нежелательно.

Наверное, нужно заводить какой-то быстрый список указателей на выделенные блоки, по которому и бегать при проверке.


 
Германн ©   (2010-05-04 02:10) [43]


> Так вот, нет абсолютно никакой гарантии, что чужое приложение
> не пошлет окну сообщение с таким же номером

Хм. Ты уверен?


 
SPeller ©   (2010-05-04 06:36) [44]

Кто запрещает приложению слать сообщения WM_USER?


 
Leonid Troyanovsky ©   (2010-05-04 07:31) [45]


> SPeller ©   (04.05.10 02:02) [42]

> Почему мне это нужно. Указатель передаю через параметр оконного
> сообщения (внутри процесса, ессно) в сообщении WM_USER +

RegisterWindowMessage?

> Наверное, нужно заводить какой-то быстрый список указателей

IMHO, выделить массив блоков потребного размера,
и использовать TBits для индексов свободных блоков.

--
Regards, LVT.


 
Игорь Шевченко ©   (2010-05-04 12:30) [46]

SPeller ©   (04.05.10 02:02) [42]

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


 
SPeller ©   (2010-05-05 02:46) [47]


> Leonid Troyanovsky ©   (04.05.10 07:31) [45]
> RegisterWindowMessage?

Мсдн не рекомендует:
Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF


> IMHO, выделить массив блоков потребного размера,
> и использовать TBits для индексов свободных блоков.

Спасибо, подумаю над этим.

Off:

> Игорь Шевченко ©   (04.05.10 12:30) [46]
> А зачем гланды вырезать через непредназначенное для этого
> отверстие ?

Игорь, у меня иммунитет к вашему снобизму. Есть что сказать по делу - говорите, нет - молчите. "Умные" советы вобщем и ни о чем одновременно мне не нужны.


 
Leonid Troyanovsky ©   (2010-05-05 08:12) [48]


> SPeller ©   (05.05.10 02:46) [47]

> must process the same message. For sending private messages
> within a window class, an application can use any integer

Дык, оно ж не приватное, бо приложение - чужое, и только
его создателю известно как оно на него среагирует.

Для гарантии нужно гарантированно уникальное (на уровне
сессии) сообщение, т.е., RWM.

> Off:

Во-ще-то, в COM есть еще всякие IMalloc.

--
Regards, LVT.


 
С любовью, твой дядя Исаак   (2010-05-05 08:33) [49]

Удалено модератором


 
Чилли-Всучилли   (2010-05-05 08:45) [50]

Указатель передаю через параметр оконного сообщения...Так вот, нет абсолютно никакой гарантии, что чужое приложение не пошлет окну сообщение с таким же номером, и что оно передаст в wParam тоже неизвестно. Ситуэйшин редкий, согласен, но зачем испытывать судьбу.

GlobalAlloc() / GlobalLock() / GlobalUnlock() / GlobalFree()
LocalAlloc() / LocalLock() / LocalUnlock() / LocalFree()

ОС сама будет следить за корректностью хендлов. При попытке залочить некорректный хендл памяти - вернет nil. Вот и вся проверка.


 
SPeller ©   (2010-05-05 08:56) [51]


> в COM есть еще всякие IMalloc

У меня свой ком :) IMalloc... тоже вариант. Кто будет лучше - IMalloc или своё на TBits? Или без разницы, только IMalloc уже готовый?

С RWM я подумаю. Сейчас использую диапазон сообщений, который отфильтровываю из очереди. RWM не гарантирует что возвращенные номера сообщений будут подряд. Поэтому, скорее всего, придется в одно сообщение всё засунуть. Наверное так и сделаю.


 
SPeller ©   (2010-05-05 09:00) [52]


> Чилли-Всучилли   (05.05.10 08:45) [50]
> GlobalAlloc() / GlobalLock() / GlobalUnlock() / GlobalFree()
> LocalAlloc() / LocalLock() / LocalUnlock() / LocalFree()
>
> ОС сама будет следить за корректностью хендлов. При попытке
> залочить некорректный хендл памяти - вернет nil. Вот и вся
> проверка.

Что-то msdn сходу пугает: The global functions are slower than other memory management functions. А мне замедлять не нуно :) Наоборот быстродействие здесь критично.


 
Leonid Troyanovsky ©   (2010-05-05 09:08) [53]


> SPeller ©   (05.05.10 08:56) [51]

> - IMalloc или своё на TBits?

Если размер блока будет удачный, то заранее распределенный массив
будет, IMHO, быстрее, бо не нужны многочисленные alloc-free.

Ну, это все при условии, что можно разово распределить
подходящий по размеру фрагмент.

--
Regards, LVT.


 
Чилли-Всучилли   (2010-05-05 09:14) [54]

are slower than other memory management function

Чем другие функции управления памятью. Некоторое замедление связано с тем, что работа ведется через хендлы ОС, а не через указатели, то есть, ОС должна заносить хендлы во внутренние списки и, при необходимости (xxxLock, xxxFree), проверять наличие хендлов в списках, переводить их в вид простых указателей, при необходимости отображая в нужные участки памяти процессов в случае GlobalXxx, а в случае LocalXxx и этого делать не надо. То есть, на деле, задержки хоть и есть, но весьма небольшие. Тем более, что все это уже даным-давно максимально оптимизировано разработчиками ОС.

То есть, на самом деле это и есть "какой-то быстрый список указателей на выделенные блоки, по которому и бегать при проверке" (С) [42], только реализованный на уровне ОС.


 
Leonid Troyanovsky ©   (2010-05-05 09:48) [55]


> Чилли-Всучилли   (05.05.10 09:14) [54]

>  при необходимости отображая в нужные участки памяти процессов
> в случае GlobalXxx,

Оно ничего не отображает, Global - это дань 16 битному прошлому.

--
Regards, LVT.


 
Игорь Шевченко ©   (2010-05-05 10:45) [56]

SPeller ©   (05.05.10 02:46) [47]


> Есть что сказать по делу - говорите, нет - молчите


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


 
brother ©   (2010-05-05 12:37) [57]

> Не могу молчать,

ну, свобода слова)


 
SPeller ©   (2010-05-05 14:42) [58]


> Leonid Troyanovsky ©   (05.05.10 09:08) [53]
> Если размер блока будет удачный, то заранее распределенный
> массив
> будет, IMHO, быстрее, бо не нужны многочисленные alloc-free.
> Ну, это все при условии, что можно разово распределить
> подходящий по размеру фрагмент.

Скорее всего не выйдет. Всегда будет вероятность превышения размера. Заранее неизвестно сколько объектов будет работать и сколько вызовов будет одновременно производиться.

off:

> Игорь Шевченко ©   (05.05.10 10:45) [56]
> Не могу молчать, у меня вызывают живой и неподдельный интерес
> потомки Ивана Кулибина, изобретающие очередной пятиколесный
> велосипед. Хочешь, чтобы молчал - не пиши.

Потомок настрадамуса?? )))
Вот ты же не спросил что для чего, отчего и почему, а уже ярлыков навешал. Это типа так правильно, так подобает Мастерам? По-моему, это обыкновенный старческий снобизм, типа я очень умный, а вы идиоты, и это не я должен думать почему не считать вас идиотами, а вы должны меня убеждать что вы не идиоты.
Проще будь.



Страницы: 1 2 вся ветка

Текущий архив: 2011.11.13;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.009 c
2-1311508935
prodex
2011-07-24 16:02
2011.11.13
Как построить запрос в Oracle, если...


2-1310392304
jetus
2011-07-11 17:51
2011.11.13
MDI-приложение и перерисовка родительской формы


15-1310737018
R_R
2011-07-15 17:36
2011.11.13
Кто-нибудь работал с FileZilla?


2-1311265628
Tim
2011-07-21 20:27
2011.11.13
вывод real числа в dbgrid


15-1310761791
Юрий
2011-07-16 00:29
2011.11.13
С днем рождения ! 16 июля 2011 суббота