Главная страница
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 поддерживает арифметику ?
или это тоже не указатель ?



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

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

Наверх




Память: 0.58 MB
Время: 0.014 c
2-1311744151
Шел мимо решил зайти
2011-07-27 09:22
2011.11.13
работа с excel


1-1272607489
alexvan
2010-04-30 10:04
2011.11.13
WordWrap в TMemo c фиксированным количеством строк


3-1266236064
Раиса
2010-02-15 15:14
2011.11.13
MySQL и несколько insert-ов


2-1311508935
prodex
2011-07-24 16:02
2011.11.13
Как построить запрос в Oracle, если...


15-1310311222
Doxer
2011-07-10 19:20
2011.11.13
Уведомления о почте (как в QIP)