Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 поддерживает арифметику ?
или это тоже не указатель ?



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

Форум: "Основная";
Текущий архив: 2011.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.004 c
2-1311252544
petka
2011-07-21 16:49
2011.11.13
Инициализация записей в массиве


2-1311432550
Pcrepair
2011-07-23 18:49
2011.11.13
Сервер-клиент РДП. обработка кнопки мыши


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


15-1310634127
Empleado
2011-07-14 13:02
2011.11.13
Design DB tables "exclusive OR"


15-1310848190
Юрий
2011-07-17 00:29
2011.11.13
С днем рождения ! 17 июля 2011 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский