Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Первые четыре байта - указатель на VTABLE / 22 сообщений из 22, страница 1 из 1
26.09.2007, 16:20:05
    #34828466
sobolev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
Замучила проблема обнуления указателя на таблицу виртуальных функций.
Кто-нибудь знает хороший метод идентификации того, что первые четыре байта участка памяти - указатель на таблицу виртуальных функций?
Заранее огромное спасибо ответившему.
...
Рейтинг: 0 / 0
26.09.2007, 16:27:26
    #34828510
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
ы? А зачем его обнулять?
...
Рейтинг: 0 / 0
26.09.2007, 16:27:34
    #34828514
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
sobolevЗамучила проблема обнуления указателя на таблицу виртуальных функций.
Кто-нибудь знает хороший метод идентификации того, что первые четыре байта участка памяти - указатель на таблицу виртуальных функций?
Заранее огромное спасибо ответившему.
А кто вам сказал что в первых 4(8) байтах указатель на таблицу виртуальных функций, для некоторых компиляторов это не так
...
Рейтинг: 0 / 0
26.09.2007, 16:28:23
    #34828518
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
Что за проблема?
...
Рейтинг: 0 / 0
26.09.2007, 16:34:48
    #34828550
sobolev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
maXmoы? А зачем его обнулять?
Обычная процедура - обнуления структур данных, лишенных конструктора. Однако, некоторые структуры усложняются и получают в навесок VTABLE. Из-за непомерного размера проекта можно не вспомнить где сколько-то лет назад было обнуление экземпляра такой структуры... приехали.
...
Рейтинг: 0 / 0
26.09.2007, 16:38:03
    #34828569
sobolev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
blinded sobolevЗамучила проблема обнуления указателя на таблицу виртуальных функций.
Кто-нибудь знает хороший метод идентификации того, что первые четыре байта участка памяти - указатель на таблицу виртуальных функций?
Заранее огромное спасибо ответившему.
А кто вам сказал что в первых 4(8) байтах указатель на таблицу виртуальных функций, для некоторых компиляторов это не так
Я про это знаю. Но на текущий момент я пользуюсь тем компилятором, на поведение которого в данном случае готов заложиться (дальше видно будет). В конце концов, я надеюсь решить проблему одним единственным куском кода, зашитым в memzero() (собственный имплемент). Соответственно, портировать такой кусок на любой компилятор или ОС - не проблема.
Так все-таки, идея у кого-нибудь есть?
...
Рейтинг: 0 / 0
26.09.2007, 16:39:12
    #34828571
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
Ну не фига-се, вот так структура с виртуальными методами
...
Рейтинг: 0 / 0
26.09.2007, 16:39:48
    #34828576
daevaorn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
sobolev
Так все-таки, идея у кого-нибудь есть?
любое решение в данном случае костыль и опасный. поэтому вооружайся контексным поиском и пиши нормальные конструкторы.
...
Рейтинг: 0 / 0
26.09.2007, 16:43:55
    #34828606
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
sobolev maXmoы? А зачем его обнулять?
Обычная процедура - обнуления структур данных, лишенных конструктора. Однако, некоторые структуры усложняются и получают в навесок VTABLE. Из-за непомерного размера проекта можно не вспомнить где сколько-то лет назад было обнуление экземпляра такой структуры... приехали.

Компилятор пишете?
А введение конструктра по умолчанию?
...
Рейтинг: 0 / 0
26.09.2007, 16:44:52
    #34828613
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
sobolev maXmoы? А зачем его обнулять?
Обычная процедура - обнуления структур данных, лишенных конструктора. Однако, некоторые структуры усложняются и получают в навесок VTABLE. Из-за непомерного размера проекта можно не вспомнить где сколько-то лет назад было обнуление экземпляра такой структуры... приехали.

НИКОГДА не обращаться к не POD-данным на низком уровне
...
Рейтинг: 0 / 0
26.09.2007, 18:25:03
    #34829188
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
sobolev wrote:

> что первые четыре байта участка памяти - указатель на таблицу
> виртуальных функций?
В g++/msvc в первые четыре байта попадает первая объявленная
не-статическая переменная внутри класса.

>Обычная процедура - обнуления структур данных, лишенных конструктора.
Это можно сделать в конструкторе, инициализаторе, и т.д. Зачем вам
доступ к VTABLE? Если у структуры есть VTABLE, лучше сделать ей
нормальный конструктор.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.09.2007, 18:41:42
    #34829229
sobolev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
ErV
sobolev wrote:

> что первые четыре байта участка памяти - указатель на таблицу
> виртуальных функций?
В g++/msvc в первые четыре байта попадает первая объявленная
не-статическая переменная внутри класса.

>Обычная процедура - обнуления структур данных, лишенных конструктора.
Это можно сделать в конструкторе, инициализаторе, и т.д. Зачем вам
доступ к VTABLE? Если у структуры есть VTABLE, лучше сделать ей
нормальный конструктор.
Posted via ActualForum NNTP Server 1.4
В msvs первые 4 байта экземпляра класса - указатель на таблицу виртуальных функций, если класс или его предок содержит хоть одну виртуальную функцию, если нет, то см. вашу реплику.
По поводу второй части вашей реплики, мне кажется, я дал исчерпывающее объяснение выше.
...
Рейтинг: 0 / 0
26.09.2007, 19:02:41
    #34829283
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
sobolev
В msvs первые 4 байта экземпляра класса - указатель на таблицу виртуальных функций, если класс или его предок содержит хоть одну виртуальную функцию, если нет, то см. вашу реплику.
По поводу второй части вашей реплики, мне кажется, я дал исчерпывающее объяснение выше.
Ну ежели кому хочется убиться, то чегоже не помочь

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
struct Eve // праматерь все богов
{
};

struct MyStruct : public Eve
{
  virtual ~MuStruct() {}
};

struct HisStruct : public Eve
{
  int a;
}

template <class S>
void memzero(S* ptr)
{
  memset(static_cast<Eve*>(ptr),  0 , sizeof(S) - (ptr - static_cast<Eve*>(ptr));
}

...
MyStruct ms;
memzero(ms);
...
Рейтинг: 0 / 0
26.09.2007, 20:13:52
    #34829475
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
Код: plaintext
ptr - static_cast<Eve*>(ptr)
наоборот
...
Рейтинг: 0 / 0
26.09.2007, 20:14:57
    #34829478
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
sobolevПо поводу второй части вашей реплики, мне кажется, я дал исчерпывающее объяснение выше.отсутствие отладчика не упомянуто.
...
Рейтинг: 0 / 0
26.09.2007, 20:17:39
    #34829486
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
sobolev wrote:
> В msvs первые 4 байта экземпляра класса
Ошибался, признаю. Только что протестил.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
#include <stdio.h>

class A{
public:
    virtual void a(){
        printf("ы\n");
    }
    virtual ~A(){
    }
};

class B: public A{
protected:
    int i;
public:
    B(){i =  1234 ;}
};


int main (int argc, char** argv){
    B b;
    printf("%d\n", *((int*)&b));
    return  0 ;
}

Выводит 134514792

Только у меня g++, и все равно не получится опознать, есть ли в начале
указатель на таблицу методов или мусор. Если данные не
инициализированы, то нельзя проверить, указатель ли это на таблицу или
рандомный мусор (хотя в отладочном режиме в неинициализированных данных
MSVC хранится 0xCCCCCCCC, для релиза это не работает).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.09.2007, 20:28:51
    #34829514
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
ErVОшибался, признаю. Только что протестил.ну приехали, а COM–компоненты каким компилятором компилятся?
...
Рейтинг: 0 / 0
26.09.2007, 20:33:46
    #34829520
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
ErVТолько у меня g++, и все равно не получится опознать, есть ли в начале
указатель на таблицу методов или мусор. Если данные не
инициализированы, то нельзя проверить, указатель ли это на таблицу или
рандомный мусор (хотя в отладочном режиме в неинициализированных данных
MSVC хранится 0xCCCCCCCC, для релиза это не работает).можно попробовать сравнить указатель на функцию с соответствующим ей значением из vtbl
...
Рейтинг: 0 / 0
26.09.2007, 20:53:18
    #34829537
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
maXmo
Код: plaintext
ptr - static_cast<Eve*>(ptr)
наоборот
А вот и нет, там вообще надо abs(ptr - static_cast<Eve*>(ptr)) чтобы и на хипе и на стеке попасть
...
Рейтинг: 0 / 0
26.09.2007, 23:00:40
    #34829696
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
maXmo wrote:

> ну приехали, а COM?компоненты каким компилятором компилятся?
Я не это имел в виду.
Я ранее написал, что вначале идут поля данных, а затем vtbl.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
27.09.2007, 14:31:04
    #34831358
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
blindedчтобы и на хипе и на стеке попастьа эти случаи чем-то отличаются?
...
Рейтинг: 0 / 0
27.09.2007, 16:30:14
    #34831960
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первые четыре байта - указатель на VTABLE
не-а, просто облажался
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Первые четыре байта - указатель на VTABLE / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]