информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetСетевые кракеры и правда о деле ЛевинаПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
правильно меркуешь, Карп 27.07.01 03:07  Число просмотров: 1720
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>

> > конечно же можно включить в main(). но повторюсь -
> цель -
> > разрушить дочернюю таблицу виртуальных ф-ий и создать
> > родительский.
> Именно так все и происходит, хорош народ пужать ;))
этих не напугаешь :-)

>
> В общем, исследование кода сгенерированного VC++ 6.0
> показало, что при использовании ссылки или указателя
> генерируется переадресация через vtbl и т.п., а при
> непосредственном обращении к объекту вызывается...
> Child::PrintMsg() ! Т.е., компилятор НАГЛО ИГНОРИРУЕТ vtbl
> вообще!
я вот о чем еще думал - это ошибка компилятора или линкера?

>
> Фенька, похоже, в том, что при вызове метода через ссылку
> или указатель компилятор не имеет права делать
> предположений о типе объекта, к которому попадет вызов и,
> следовательно, создает код, обрабатывающий vtbl, что, в
> общем, совершенно верно и в твоем примере приводит к вызову
> Parrent::PrintMsg().
>
> Другое дело, если компилятор при вызове метода ТОЧНО ЗНАЕТ
> ТИП ОБЪЕКТА (или, во всяком случае, он так считает ;) ).
> По-видимому, он предполагает, что тип не может измениться
> во время существования объекта и по этому поводу на разборе
> vtbl можно сэкономить. На мой взгляд, такое поведение
> вполне логично для языка со статической типизацией, хотя и
> оставляет возможности для целой кучи разнообразных трюков.

не знаю точно, но чую что так не правильно. скорее всего у объекта должен быть vtbl, который меняется. и не в зависимости ни от чего - знает объект свой тип или нет - если вызывается виртуальная ф-ия, то вызов идет через vtbl. короче посмотри мой мессаг с примерами to c0x@mail.ru где то в конце нитки.
самое страшное, то что думаю что тут халтура, сжульничали, т.е.
все знают, что виртуальные ф-ии замедляют работу. вот по этому, компании в гонках за славой - типа наш откомпилиный код выполняется во столько раз быстрее - просто вшили в объект ф-ии как самые простые и НАГЛО проигнорировали vtbl. никому и в голову не пришло бы в Child child - e vtbl менять.

в технологии COM паередается указатель не на объект, а на vtbl.

> Однако, остались вопросы:
> 1. Что думает по этому поводу Страуструп ?
> 2. Что пишет по этому поводу ANSI ?
это не знаю

> 3. Как сделаны другие компиляторы?
все что попадалось - одно и то же.......

>
> > правильно. иначе можно доказать, что *pChild != child;
> что
> Угу, так и есть :))), только еще хуже: child != child ;)
>
> > собственно сделал XR. и код который ты показал тоже
> верный,
> > такое я тоже пробовал. много чего извращенного делал.
> но
> > разве так и должно быть? виртуальные ф-ии должны быть
> > динамичные иначе на хрен они нужны
> Виртуальные функции нужны как раз для реализации
> полиморфизма обращением через указатель или ссылку.
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach