Форум: "Основная";
Текущий архив: 2011.11.13;
Скачать: [xml.tar.bz2];
ВнизМожно ли проверить указатель на корректность? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.63 MB
Время: 0.006 c