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

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

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

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

Сообщение zub » 24.08.2016 02:07:35

"Способ" работает не так как тебе надо:
Ты проверяешь по каким то критериям (доступность области памяти, vmt, еще ченить приплети, без разницы) и если они не проходят - ты 100% говоришь что там не инстанс класса, а непонятно что
А вот если эти критерии все прошли, то ты не можешь сказать что там точно инстанс. Либо инстанс, либр чтото очень похожее на него.

Т.е. своим "хаком" ты можешь предварительно отбраковать конкретный мусор. Но то что пройдет через тест требует дополнительного разбирательства, которое имея только адрес в памяти провести не представляется возможным((
Дискас?

Добавлено спустя 6 минут 24 секунды:
jakyro писал(а):Ну просто ты утверждаешь, что ты всё знаешь, я и решил спросить, мож и это тоже знаешь...

Где я такое сказал?
jakyro писал(а):А утверждаешь что "всё знаешь" потому, что пытаешься доказать что хака нет, в то время, когда кругом пишут хаки на подобную тему.

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

А ты никогда не видел как отладчик кажет мусор вместо класса? Прикинь иногда такое бывает... Отладчик просто пытается интерпретировать кусок памяти в соответствии с какимто описанием. Правильно он это делает или нет - ему до лампы... Чудесных хаков нет в отладчике((
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение jakyro » 24.08.2016 02:20:27

zub писал(а):Ты проверяешь по каким то критериям (vmt, еще ченить приплети, без разницы) и если они не проходят - ты 100% говоришь что там не инстанс класса, а непонятно что
А вот если все эти критерии все прошли, то ты не можешь сказать что там точно инстанс. Либо инстанс, либр чтото очень похожее на него.

Да, это и называется "хак", который примерно делает то что нужно, но и не работает идеально во всех случаях...

А vmt - это просто тест от балды, увидел в тех хаках, решил посмотреть что выдаёт в таком случае, но оказалось что я пришёл к тому же что и TForm(ptr).
(просто с 12345678 - это почему-то сработало, я и подумал что оно работает).
А не работает только в тех случаях, когда нет доступа к памяти. Вот и добавить проверку доступа к памяти, затем добавить этот хак и будет корректно работать.
Т.к. если есть доступ к памяти, структура успешно построится и можно проверить что в ней написано, сравнить с успешными результатами, найти какие-то критерии, сигнатуры.
И тогда, вероятность что хак поймает что-то не то, будет крайне мала.

На крайний случай хак с исключениями, всё ещё рабочий, просто мож я не правильно использую исключения в lazarus, не могу поймать, может mod delphi нужно поставить, как я заметил в тестовом коде скалогрыза, а мож не до конца отрубаю отладку.
Ну короче, просто нужна правильная реализация. В делфи это работает и до XE2 версии, выше не тестировал.
Чем не хак?

Добавлено спустя 2 минуты 56 секунд:
zub писал(а):Ты гдето выше говорил что понимаешь как это всё работает.

Да, я говорил про случаи, которые я конкретно привёл, а не про всё в мире, как ты это сказал, что "хака нет".
Аватара пользователя
jakyro
новенький
 
Сообщения: 38
Зарегистрирован: 22.08.2016 08:04:21

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

Сообщение zub » 24.08.2016 02:39:52

Вот и добавить проверку доступа к памяти, затем добавить этот хак и будет корректно работать.

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

Ну короче, просто нужна правильная реализация. В делфи это работает и до XE2 версии, выше не тестировал.

Нету ее, этой реализации, не может быть.
Ты неумеешь тестировать кстати. В таком случае твой хак работает:
Код: Выделить всё
cmp := CmpCreate;
CmpDelete(cmp); { Объект %s успешно удален. }
CmpDelete(cmp); { Объект %s уже был удалён! }

А в таком работает уже с какойто вероятностью:
Код: Выделить всё
cmp := CmpCreate;
CmpDelete(cmp);
...
{тут активная работа с памятью - создание - удаление множества объектов в куче}
...
CmpDelete(cmp); { if ЛежитНаправо then (Объект %s успешно удален) else УдаляемПовторноСоВсемиВытекающими }


Благадаря "вероятносным" особеностям твоего "хака" пользователи будут ловить чудесные ошибки по понедельникам и средам в четные месяцы. Пользователи проклянут тебя, ты проклянешь lazarus и fpc
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение jakyro » 24.08.2016 02:56:36

zub писал(а):Нету ее, этой реализации, не может быть.
Ты неумеешь тестировать кстати. В таком случае твой хак работает:

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

zub писал(а):Ладно, фиг с ним. Пусть ты нашел способ проверять является ли ссылка валидным пока не уничтоженым инстансом какоголибо класса. Дальше что? Обяжешь пользователя при каждом чихе в скрипте проверять валидность?
что помешает пользователю крэшнуть твое хозяйство просто запустив такой скрипт наподобии
Код: Выделить всё
MyButton:=TButton.Create;
MyButton.Free;
MyButton.Free;

как после этого кода себя ведёт программа? И не стесняйся поделиться результатами.

Оооо, ёёёёёёё... Так это ты же и просил :shock:
Жесть, как же у тебя всё запущено с памятью, восприятием сообщений и т.д. ...

zub писал(а):Благадаря "вероятносным" особеностям твоего "хака" пользователи будут ловить чудесные ошибки по понедельникам и средам в четные месяцы. Пользователи проклянут тебя, ты проклянешь lazarus и fpc

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

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

Сообщение zub » 24.08.2016 03:02:24

Я говорю в пустоту((

Оооо, ёёёёёёё... Так это ты же и просил :shock:

ты не видишь разницу?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение jakyro » 24.08.2016 03:04:10

Я ведь просто привёл тестовый код, а ты воспринимаешь это как есть, узко мыслишь!
Вообще не можешь широко, абстракто мыслить.
Неужели не понятно, что это не конечный результат, написанный между сообщений за пару минут с потолка!?
jakyro писал(а):Я вот на коленке хак изобрёл. Потестировать его ещё на других классах, в другой обстановке и т.д. и т.п.
С переменными Pv1, Pv2 можно работать, проверять свойства, ошибок не выдаёт. Но и работать с этим нужно осторожно. Кто знает что прилетит с "пользовательского указателя".
Нужно многое протестировать, проверить, написать условий. А ещё можно через pinterfaceentry, pinterfacetable и т.д. Которые пытаются преобразовать указатель в инфу о объекте.
(ну и конечно это не останется в таком виде, это просто тест (описание для особенных))

Я ведь тут даже для "одарённых", специально расписал, что это не конечный результат, что так делать нельзя, что нужно дорабатывать...

Ну тебя...

Добавлено спустя 1 минуту 52 секунды:
zub писал(а):ты не видишь разницу?

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

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

Сообщение zub » 24.08.2016 03:06:50

jakyro писал(а):Опять же, смотря как ты реализуешь хак.

Я - никак, Есть более надежные способы, если вдруг мне когдато чтото понадобится

jakyro писал(а):И хватит опираться на тестовый гкод, это ведь и дураку понятно, что это не конечный результат и на этом всё не останавливается, там ещё месяца разработок и тестов на практике, модификация хака.

Ок. подожу месяц, потом в личку скинь результат.

Добавлено спустя 4 минуты 27 секунд:
Код: Выделить всё
MyButton:=TButton.Create;
MyButton.Free;
MyButton.Free;

и
Ладно, фиг с ним. Пусть ты нашел способ проверять является ли ссылка валидным пока не уничтоженым инстансом какоголибо класса. Дальше что? Обяжешь пользователя при каждом чихе в скрипте проверять валидность?
что помешает пользователю крэшнуть твое хозяйство просто запустив такой скрипт наподобии

vs
Код: Выделить всё
cmp := CmpCreate;
CmpDelete(cmp); { Объект %s успешно удален. }
CmpDelete(cmp); { Объект %s уже был удалён! }

Насколько я понимаю в первом случае проверок нет. скрипт напрямую 2 раза вызывает деструктор (или ты таки всё засунул в обертки?), во втором случае твои супермегопроверки внутри CmpDelete.

Добавлено спустя 2 минуты 50 секунд:
Типа ты хочешь отмазаться тем

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

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

Сообщение jakyro » 24.08.2016 03:15:01

zub писал(а):Ок. подожу месяц, потом в личку скинь результат.

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

zub писал(а):Насколько я понимаю в первом случае проверок нет. скрипт напрямую 2 раза вызывает деструктор, во втором случае твои супермегопроверки внутри CmpDelete.

Просто тема шла про валидацию и скриптовой язык, и т.д.
Я логически предположил, что ты написал примерный код того, что будет у меня в скрипте, подкрепив это словами "запустив такой скрипт подобии", не зная скриптового языка о котором я говорю, ты и написал этот код...
А оказывается ты тупо написал pascal код, который не возможно вызвать у меня в проекте со стороны пользователя, со стороны скриптового языка, который работает с SDK?
Во втором случае это выглядит глупей...
Моя теория, о твоём узком мышлении, только подтверждается...
Аватара пользователя
jakyro
новенький
 
Сообщения: 38
Зарегистрирован: 22.08.2016 08:04:21

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

Сообщение zub » 24.08.2016 03:18:27

Моя теория о твоём узком мышлении только подтверждается...

Блин, меня раскусили((
Всё, завязываю метать бисер((
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение скалогрыз » 24.08.2016 08:18:34

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

очень возможно что искать указатель среди тысячи (при использовании авл дерева, это максимум 10 сравнений), может быть даже быстрее, чем через хак.

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

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

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

Сообщение Лекс Айрин » 24.08.2016 09:32:22

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


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

Добавлено спустя 13 минут 2 секунды:
jakyro писал(а):Ну если хака нет, то тогда его стоит написать.


Хак нельзя написать просто так... это использование особенностей конкретной реализации (зачастую на конкретном процессоре и под конкретной осью).

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


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

jakyro писал(а): а на анализе памяти.


Учи матчасть! Отладчик не анализирует память. Он анализирует состояние процессора в конкретный момент времени. Ну и может иногда выдавать ассемблерный/бинарный код и состояние памяти в конкретный момент, но это уберплюшки. Для чегото большего нужно писать кучу простыней и использовать отладочную информацию, которая, фактически, является второй версией программы, заточенной под отладчик.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение jakyro » 24.08.2016 22:56:06

Лекс Айрин, Ну ты можешь вообще ничего не писать. То что ты новичёк, я и с первого раза понял.

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

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

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

Лекс Айрин писал(а):Для этого у отладчика есть куча простыней, которые тебе реализовывать просто лень. Другой причины я не вижу.

Тут не было вопроса "в чём причина", тут было утверждение, что отладчик так может, а выше указанный пользователь утверждал, что это "не возможно".
И мне не лень это реализовать, просто я ищу способ "КАК это реализовать", потому и зашёл спросить... Не логично?

Лекс Айрин писал(а):Учи матчасть! Отладчик не анализирует память. Он анализирует состояние процессора в конкретный момент времени.

Да? А где хранится состояние процессора? В памяти!
Ты сам то свою матчасть перечитай, а то наверно не в курсе, что весь компьютера основан на работе с той или иной памятью...
Аватара пользователя
jakyro
новенький
 
Сообщения: 38
Зарегистрирован: 22.08.2016 08:04:21

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

Сообщение MysticCoder » 24.08.2016 23:10:48

Сплайсим функции TObject.InitInstance и TObject.FreeInstance, ставим туда джамп на свои функции, в которых прописываем собственно тела этих самых функций, чтобы не надо было восстанавливать джампы, и добавляем работу по учету этих самых TObject, добавление\удаление из глобального списка экземпляров TObject. В нужный момент ищем указатель в списке. Profit.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

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

Сообщение jakyro » 25.08.2016 01:18:58

MysticCoder писал(а):Сплайсим функции TObject.InitInstance и TObject.FreeInstance, ставим туда джамп на свои функции, в которых прописываем собственно тела этих самых функций, чтобы не надо было восстанавливать джампы, и добавляем работу по учету этих самых TObject, добавление\удаление из глобального списка экземпляров TObject. В нужный момент ищем указатель в списке. Profit.

Ну давай теперь каждый напишет одно и тоже.
Вопрос был в другом. И про различные способы слежки за указателями тут пишет каждый первый.
Но я спрашивал, как узнать, что записано в любом заданном пользователем указателе... Без организации каких-то там менеджеров, списков и т.д.
Средствами lazarus, pascal прочитать то, что на что ссылается указатель, если это возможно, иначе сообщить о невозможности на что ссылается указатель.

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

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

Сообщение zub » 25.08.2016 01:34:59

jakyro писал(а):Лекс Айрин, Ну ты можешь вообще ничего не писать. То что ты новичёк, я и с первого раза понял.

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

Сантехника нужно непустить к санфаянсу. Убить или просто выгнать - личное дело каждого. Я б убил и сдал обратно в тсж - пусть реанимируют и выдают правильный инструмент))
jakyro писал(а):Ты же вместо этого предлагаешь всё к херам крашнуть, не сообщить место ошибки, причину и не сохранив данные работы программы.

У тебя талант приписывать людям то что они не говорили. Молча убивают уголовники и некоторые антивирусы, програмисты всегда громко объявляют кого, где, когда, за что и почему.

Ты чето выше говорил про то что в отладчике видно - класс это или не класс.
Код: Выделить всё
program Project1;
uses classes,sysutils;
var
  ms:TMemoryStream;//просто для примера. можно взять любой другой класс
  arr:array of byte;
begin
  ms:=TMemoryStream.create;//создаем настоящий класс
  setlength(arr,ms.InstanceSize);//готовим место для мусора
  Move(pointer(ms)^,arr[0],ms.InstanceSize);//"клонируем" "мусорную" копию настоящего класса
  ms.free;//уничтожаем настоящий класс
  pointer(ms):=@arr[0];//вотон "мусорный" указатель, неотличимый от настоящего
{breackpoin}ms.free;//тут разгляди в отладчике ms. это мусор, но выглядит как реальный TMemoryStream
                    //никакой твой валидатор не отличит фейковый ms от реального
end.

На {breackpoin} поставь точку останова и попытайся в отладчике понять реальный это класс или нет. натрави на него своих валидаторов - они будут уверять что реальный... но при попытке выполнить free будет вылет (В зависимости от реализации вылет может быть не на free а на финализации массива)
Проверь этот пример в своем старом пректе в делфи - тамошные валидаторы тоже пролетят. Скажешь подобные ситуации с образованием нужного набора байтиков невозможны в реальной жизни? по средам и четвергам - возможны. да и байтиков та нужно всего ничего
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru