Ссылается ли указатель на компонент?

Вопросы программирования и использования среды Lazarus.

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

Re: Ссылается ли указатель на компонент?

Сообщение скалогрыз » 22.08.2016 21:00:36

jakyro писал(а):Просто вот кину, мож почитаешь 2004 года то, о чем я говорю, понадобилось же кому-то... Правда тут сборник других хаков, хотя и try тоже есть.
http://hallvards.blogspot.ru/2004/06/ha ... bject.html

:D
Notice that this version is specific to D6 and D7 (IIRC). Other versions might need to update the hardcoded magic number (17).

Хак на хаке хаку погоняет

Ехал хака через хаку
Видит хака - хака-хака
Сунул хака хаку в хака
Хака Хака ...Хака Хака.

Вирт плачет кроваыми слезами. Где же то самое надёжное программирование о котором он говорит уже полвека?!
То когда, програмы будут точно знать с какими данными они работают, а не будут ожидать что вот сейчас упадёт (try..except) и можно будет с уверенностью сказать, что тот указатель был таки не свежий.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Ссылается ли указатель на компонент?

Сообщение zub » 22.08.2016 21:04:32

>>Если ты считает, что бегать по дереву/списку это медленно, то можешь завести себе массив элементов, на выдавать наружу не указатель а номер эелмента.
Винда не тормозит - значит бегать по сортированому списку не накладно.
но даже это не является защитой от:
Код: Выделить всё
BadPtr := циферки;

От этого не защитит никто никогда, т.к. циферки могут случайно совпасть с чемто валидным, но другим.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Ссылается ли указатель на компонент?

Сообщение скалогрыз » 22.08.2016 21:09:29

zub писал(а):Винда не тормозит - значит бегать по сортированому списку не накладно.

Да, а ещё добавить, что в винде всё сложнее, ибо NT ядро делает такие вещи, как ref-counting, расшаривание хендлов, потокобезопасность, очередь сообщений.
Много всего полезного.

Добавлено спустя 5 минут 10 секунд:
zub писал(а):От этого не защитит никто никогда, т.к. циферки могут случайно совпасть с чемто валидным, но другим.

От этого защитит ООП.
Потому что если от циферки перейти к объекту, то тип объекта можно вполне надёжно проверить (тот же is).
И по крайней мере не сделать чего-либо нехорошего.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Ссылается ли указатель на компонент?

Сообщение jakyro » 22.08.2016 21:41:07

скалогрыз писал(а):
jakyro писал(а):Да, это я и считаю глупым, затратным по времени, по ресурсам способом.

як так?
Ты же сначала написал:
jakyro писал(а):По сути ведь это банальная задача для языка такого уровня: проверить читаема ли память, прочитать участок памяти, убедиться что в нем нет конкретной структуры или есть.

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

скалогрыз писал(а):В лазарусе она есть, и точно такая же. Тот же самый try..except. Только отладчик выключи.

И сообщения все отрубить? Чтобы все ошибки улетали в винду?
Отрубал отладочную информацию, всё равно выдаёт. Наверно и ещё что-то поотрубать нужно.
Узко и банально мыслишь. Это ведь первое, о чём я подумал. Отрубить отладку, чтобы не выбивало в отладку всякие ошибки...

Я вот на коленке хак изобрёл. Потестировать его ещё на других классах, в другой обстановке и т.д. и т.п.
С переменными Pv1, Pv2 можно работать, проверять свойства, ошибок не выдаёт. Но и работать с этим нужно осторожно. Кто знает что прилетит с "пользовательского указателя".
Нужно многое протестировать, проверить, написать условий. А ещё можно через pinterfaceentry, pinterfacetable и т.д. Которые пытаются преобразовать указатель в инфу о объекте.
(ну и конечно это не останется в таком виде, это просто тест (описание для особенных))
Код: Выделить всё
procedure test;
var
  FormPtr, BadPtr: PtrInt;
  Pv1, Pv2: PVmt;
begin
  Pv1 := nil;
  Pv2 := nil;
  FormPtr := PtrInt(Form1);
  BadPtr := PtrInt(1235678);
  Pv1 := PVmt(FormPtr); { тут всякая инфа о объекте, пока особо не вникал }
  Pv2 := PVmt(BadPtr); { тут в основном пустые указатели, да типы фиксированных размеров }
end;


Можете теперь на вопросы пользователям отвечать, типа "вот так", "к нам пришёл преосвященный и оставил это послание".

Добавлено спустя 4 минуты 59 секунд:
zub писал(а):Винда не тормозит

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

Добавлено спустя 50 секунд:
Не удалось прочитать указатель БАМ синий экран смерти :twisted: (политика винды)(я же хочу другую политику, пусть приложение работает до посинения)
Аватара пользователя
jakyro
новенький
 
Сообщения: 38
Зарегистрирован: 22.08.2016 08:04:21

Re: Ссылается ли указатель на компонент?

Сообщение zub » 22.08.2016 21:55:52

>>Отрубал отладочную информацию, всё равно выдаёт. Наверно и ещё что-то поотрубать нужно.
А запускать не из под лазаря преширокомыслящий дон пробовал?

>>С переменными Pv1, Pv2 можно работать, проверять свойства, ошибок не выдаёт.
ну ты оптимист)). это на конкретно твоем компе конкретно сегодня ошибок нет. не факт что завтра также повезет

>>Можете теперь на вопросы пользователям отвечать, типа "вот так", "к нам пришёл преосвященный и оставил это послание".
это хрень а не послание. Назови мне хоть одну причину по которой мусор лежащий там куда ссылается указатель лежащий в 1235678 не может быть похожим на валидную вмт?

Добавлено спустя 4 минуты:
>>политика винды
Пока это твоя политика - заложить в основу работающие на хаках = неработающие принципы. И ждать какойто надежности
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Ссылается ли указатель на компонент?

Сообщение скалогрыз » 22.08.2016 22:03:43

jakyro писал(а):Чтение памяти - это не значит, бегать по массиву с указателями. Это то и значит, что я написал. Чтение памяти, конкретно по заданному указателю, а не искать где-то в массивах его. Прямое чтение. Ну понятно, не? Мож ещё страницу описать

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

Ганарнтирую что такая вещь заработает очень хорошо, но в какой-нибудь managed-среде. И выбор здесь богатый: писать под jvm или .Net :D

jakyro писал(а):Можете теперь на вопросы пользователям отвечать, типа "вот так", "к нам пришёл преосвященный и оставил это послание".

"Вот так":
* каждый раз, когда твоя библиотека/sdk/api выдаёт на ружу указатель на какой-либо компонент (созданный этой библиотекой) , ты этот указатель заносишь в список
* каждый раз, когда пользователь передаёт тебе указатель на компонент, который якобы был создан твоей библиотекой/sdk/api, ты должен его сверять со списком.
** если переданный компонент находится в списке, то ты ему доверяешь
** если переданный компонент ненаходится в списоке, ты можешь сообщить об этом пользователю, предусмотренным библиотекой/sdk/api способом
* при освобождении компонента, он должен быть удалён из списка

Добавлено спустя 1 минуту 37 секунд:
zub писал(а):>>Отрубал отладочную информацию, всё равно выдаёт. Наверно и ещё что-то поотрубать нужно.
А запускать не из под лазаря преширокомыслящий дон пробовал?

Да нет же. Он просто делал вот так:
Код: Выделить всё
var
  b : PtrUInt;
  f : TForm;
begin
  b:=123456;
  try
    f:=TForm(b);
  except
     //в надежде что оно упадёт.
     ShowMessage('ololo');
  end;
  f.Caption:='hello world';


Хотя надо вот так:
Код: Выделить всё
var
  b : PtrUInt;
  f : TForm;
begin
  b:=123456;
   f:=TForm(b);
  try
     f.Caption:='hello world';
  except
     ShowMessage('ololo');
  end;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Ссылается ли указатель на компонент?

Сообщение zub » 22.08.2016 22:09:23

скалогрыз
>>"Вот так":
*** никакие указатели наружу не выдаются, а выдается чттото аналогичное хэндлам. Т.к. нет смысла доверять указателю, если "клиент" может безнаказано испортить не указатель, а то на что этот указатель указывает

>>Да нет же. Он просто делал вот так:
Я стесняюсь подумать что он там делает))
Этож надо такое замутить изза повторноного вызова деструктора))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Ссылается ли указатель на компонент?

Сообщение jakyro » 22.08.2016 22:13:36

скалогрыз писал(а):Да нет же. Он просто делал вот так

Ты хаки смотрел?
Хак работает на получении ClassInfo, если не удалось получить, выбивает исключение, следовательно это не то что мне нужно. Так работало в старом движке... Это был хоть какой-то костыль, учитывая то, что там никакой другой проверки не было, никакого менеджера памяти не было и при любом не верном аргументе из не типизированного скриптового языка, выбивало на рабочий стол.
Что предпочтительней?
1. Вырубать программу в не типизированном скриптовом языке, навязывая строгие правила типизированного компилируемого языка?
2. Или просто добавить обработку исключений?
Ну или изобрести другую обработку, хаки... Ты что предпочитаешь 1 вариант?
Не знаешь конкретной задачи и пытаешься что-то навязать, какую-то "правильную" точку зрения. Задача такая, проверить указатель!
Аватара пользователя
jakyro
новенький
 
Сообщения: 38
Зарегистрирован: 22.08.2016 08:04:21

Re: Ссылается ли указатель на компонент?

Сообщение скалогрыз » 22.08.2016 22:14:21

zub писал(а):*** никакие указатели наружу не выдаются, а выдается чттото аналогичное хэндлам. Т.к. нет смысла доверять указателю, если "клиент" может безнаказано испортить не указатель, а то на что этот указатель указывает

"клиент" может делать всё что ему захочется с памятью собственного процесса, так что потенциально нагадить он сможет в любой момент :)
Но, если вспомнить файловые дескрипторы или сокеты юниксовые, так там тоже возвращется хендл (индекс) попорядку.
Или те же PID-ы присваиваются. И ничего, и шустро работают :)

Ну не любит человек косвенную адрессацию, ну что ты с ним сделаешь! Список указателей это то что для него сгодиться.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Ссылается ли указатель на компонент?

Сообщение zub » 22.08.2016 22:17:28

>>Задача такая, проверить указатель!
Расходимся, пацаны((

Добавлено спустя 2 минуты 6 секунд:
jakyro
zub писал(а):Назови мне хоть одну причину по которой мусор лежащий там куда ссылается указатель лежащий в 1235678 не может быть похожим на валидную вмт?

Не игнорь, ответь. Станет чуток полегче
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Ссылается ли указатель на компонент?

Сообщение скалогрыз » 22.08.2016 22:21:24

jakyro писал(а):Ты хаки смотрел?
Хак работает на получении ClassInfo
...
Ну или изобрести другую обработку, хаки... Ты что предпочитаешь 1 вариант?
Не знаешь конкретной задачи и пытаешься что-то навязать, какую-то "правильную" точку зрения. Задача такая, проверить указатель!

Третий раз говорю - я предпочту вести список указателей. Я их породил - я за ними прослежу.
Вариант сверхнадёжный и не требует создания инфраструктуры хендлов.

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

Добавлено спустя 17 секунд:
zub писал(а):Расходимся, пацаны((

согласен.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Ссылается ли указатель на компонент?

Сообщение zub » 22.08.2016 22:25:11

скалогрыз
>>"клиент" может делать всё что ему захочется с памятью собственного процесса, так что потенциально нагадить он сможет в любой момент :)
Тут смысл не только в памяти, а в том что при такой схеме "клиент" непоследственно с объектом ниче сделать неможет, только средствами "сервера" - исключаются ситуации типа повторного вызова деструктора. Мечта о абсолютной надежности всё ближе))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Ссылается ли указатель на компонент?

Сообщение jakyro » 22.08.2016 22:47:46

скалогрыз писал(а):Если пользователь не умеет программировать, то это исключительно его проблемы. Занимать память защитой от дурака желания особого не возникает.

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

скалогрыз писал(а):Третий раз говорю - я предпочту вести список указателей. Я их породил - я за ними прослежу.
Вариант сверхнадёжный и не требует создания инфраструктуры хендлов

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

Ну вот. Имеешь ты список указателей, где панель удалил, а кнопку пропустил и в списке у тебя осталась кнопка, к которой при обращении всё крашнится.
Вот тебе тут и другая, побочная инфраструктура и костыли. Придётся ещё и все дочерние объекты отслеживать, вместо того что бы просто добавить проверку указателя.

Т.е. вместо того чтобы просто добавить проверку указателя, тебе придётся решать побочные проблемы. Хотя всё это решилось бы проверкой указателя.

zub писал(а):Назови мне хоть одну причину по которой мусор лежащий там куда ссылается указатель лежащий в 1235678 не может быть похожим на валидную вмт?

Назвал.

скалогрыз писал(а):Ну не любит человек косвенную адрессацию, ну что ты с ним сделаешь! Список указателей это то что для него сгодиться.

Не в этом дело. Зачем Ящик называть Коробкой, когда Коробка ссылается на не существующий Ящик?
Ситуаций при потере указателя в скриптовом языке - КУЧА. И тебе придётся либо всё это обрабатывать, изобретать всякие списки, проверки, хуки и прочее, либо ПРОСТО добавить "проверку указателя".

Добавлено спустя 7 минут 48 секунд:
И для отладки проверка указателя - полезна.
Можно выводить информативные сообщения, где у него в скрипте есть обращение к несуществующему объекту, вместо того что раз и БААМ крашнуть программу, и думай в чём дело. :D

Добавлено спустя 18 минут 43 секунды:
zub писал(а):Эмоции у автора поперли со второго поста. Сдержаней надо быть))

Кстати на счёт эмоций. А то я что-то не очень эмоциональный, пропустил такую провокацию.

Я пришёл как бы на специализированный форум pascal, зашёл в специальный раздел lazarus и спросил, как решить конкретную задачу.
Во втором посте я спросил "И что это?". Это все эмоции?
Почему спросил? Потому что автор сообщения даже не удосужился проверить свою теорию о is.
Далее, другой специалист говорит "никак", просто сразу "никак", даже не думая, не рассуждая. Ну и я должен был сказать такой "ну ладно, спасибо freepascal".

Но я то решал уже подобную задачу, дело то только в подборе хака или спец. функций (которые в результате беседы всё ещё не проявились).
А далее просто обмен теми же эмоциями и попытка мне доказать, что задача про "поезда", мне лучше подойдёт, чем задача про "проверку указателя".
Причем тут поезда? А причем тут список указателей? Мне нужно проверить на что ссылается любой указатель, а не на то, есть ли он в моём списке "почётных указателей"


Зато себе на вопрос я успешно ответил, пытаясь вам объяснить зачем это нужно и доказать что это действительно можно реализовать...
Спасибо мне. Если не найдется ответа с какой либо спец. функцией проверки указателя, то тему можно считать решенной, закрытой, так как был найден не плохой трюк с типами указателей.
Аватара пользователя
jakyro
новенький
 
Сообщения: 38
Зарегистрирован: 22.08.2016 08:04:21

Re: Ссылается ли указатель на компонент?

Сообщение скалогрыз » 22.08.2016 23:19:42

jakyro писал(а):Имеет пользователь в памяти скриптового языка, два экземпляра классов - панель и кнопка.
Пользователь удаляет панель, но так как владельцем кнопки была панель, кнопка тоже удаляется, никак не сообщив об этом скриптовому языку, иначе пришлось бы менять классы LCL, как это сделано в библиотеке для питона.

Ну вот. Имеешь ты список указателей, где панель удалил, а кнопку пропустил и в списке у тебя осталась кнопка, к которой при обращении всё крашнится.
Вот тебе тут и другая, побочная инфраструктура и костыли. Придётся ещё и все дочерние объекты отслеживать, вместо того что бы просто добавить проверку указателя.

а с почему это пропустили кнопку? при удалении.
Ты же сам устанавливаешь правила - панель владелец кнопки, если владелец удалён, то кнопка тоже освобождается, а значит кнопку из списка придётся выкидвать.

Т.е. это твоя ответсвтенность отслеживать - дочерние объекты.
И тут есть два решения.
1) т.к. уничтожение объекта происходит таки ли иначе через твою функцию, то эта функция должна собрать всех детей и их зачистить. (это чтобы LCL классы не менять)
2) если лень собирать детей, то ты можешь каждому созданному контролу повесить евент AddHandlerOnBeforeDestruction.
Он будет вызывать каждый раз когда контрол освобождается, и ты сможешь вычистить его из списка.

И то, что там где-то осталась ссылка на удёлнную кнопку, тебе никак не вредит, т.к. из списка её уже вычистили.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Ссылается ли указатель на компонент?

Сообщение zub » 22.08.2016 23:26:07

>>Я пришёл как бы на специализированный форум pascal, зашёл в специальный раздел lazarus и спросил, как решить конкретную задачу.
Начнем с того что ты ошибся разделом. lazarus тут непричем. Если подобная "фича" гдето и должна быть, то это fpc.

>>Почему спросил? Потому что автор сообщения даже не удосужился проверить свою теорию о is.
jakyro писал(а):Дело то в том, что в lazarus оператор is добывает инфу где-то из самого объекта или т.п. Но объект не является объектом и выдаст ошибку доступа к памяти.

А ты проверяешь не пытаясь копаться в "кандидате" на "объект"? нет?

>>Далее, другой специалист говорит "никак", просто сразу "никак", даже не думая, не рассуждая. Ну и я должен был сказать такой "ну ладно, спасибо freepascal".
zub писал(а):В общем случае никак.

)) ну если никак. Что тут еще можно сказать? Все попытки порассуждать ты заигнорил

>>Причем тут поезда? А причем тут список указателей? Мне нужно проверить на что ссылается любой указатель, а не на то, есть ли он в моём списке "почётных указателей"
А причем тут твой скриптовый язык?

>>Зато себе на вопрос я успешно ответил, пытаясь вам объяснить зачем это нужно и доказать что это действительно можно реализовать...
>>Спасибо мне. Если не найдется ответа с какой либо спец. функцией проверки указателя, то тему можно считать решенной, закрытой, так как был найден не плохой трюк с типами указателей.
Точно, спасибо тебе. Ты молодец))

Добавлено спустя 19 минут 30 секунд:
>>Назвал.
Извините, где?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 245

Рейтинг@Mail.ru