Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
#1

Как получить размер функции? - C++

06.04.2012, 15:27. Просмотров 1912. Ответов 13
Метки нет (Все метки)

её начало я получаю с помощью ассемблера(offset), не получается получить её конец и вычислить её длину
P. S. Borland c++ 6
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
9438 / 5461 / 925
Регистрация: 25.07.2009
Сообщений: 10,481
06.04.2012, 15:34     Как получить размер функции? #2
Цитата Сообщение от Van111 Посмотреть сообщение
не получается получить её конец и вычислить её длину
Просто из любопытства: а Вам оно за чем?
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
06.04.2012, 15:57  [ТС]     Как получить размер функции? #3
Цитата Сообщение от easybudda Посмотреть сообщение
Просто из любопытства: а Вам оно за чем?
WriteProcessMemory

Добавлено через 20 минут
неужели некто не знает?

Добавлено через 52 секунды
неужели некто не знает?
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
06.04.2012, 15:59     Как получить размер функции? #4
Легально (т.е. средствами, гарантированными Стандартом языка, а значит, работающими всегда и на всех мыслимых платформах) - никак.
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
06.04.2012, 16:52     Как получить размер функции? #5
А если говорить о нелегальных способах, то можно так(тестировалось на 32 битных осях, винда и линукс, компилятор mingw/gcc соответственно):

C
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
26
#include <stdio.h>
extern const long test_size;
 
#ifdef __cplusplus
extern "C" {
    static void test_func(void);
}
#endif
asm("L_B1:");
static void test_func(void)
{
    asm volatile("nop");
}
#ifdef WIN32
asm("_test_size: .long .-L_B1");
#else
asm("test_size: .long .-L_B1");
#endif
 
int main(void)
{
    
    test_func();
    printf("Start_adress: %p, size: %ld\n",test_func,test_size);
    return 0;
}
http://liveworkspace.org/code/dd9802...7b580995b55d53

Добавлено через 8 минут
з.ы. предлагаю модераторам перенести эту тему сюда http://www.cyberforum.ru/cpp/
имхо, вопрос не попадает в категорию "для новичков"
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
06.04.2012, 20:34  [ТС]     Как получить размер функции? #6
а при помощи ассемблерных команд можно?
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
06.04.2012, 20:39     Как получить размер функции? #7
Цитата Сообщение от Van111 Посмотреть сообщение
а при помощи ассемблерных команд можно?
а код выше разве без участия ассемблера?
идея в том, чтобы создать переменную и положить в неё размер функции, который вычисляется
как разница между началом и концом, это я и привёл в примере.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
06.04.2012, 21:57  [ТС]     Как получить размер функции? #8
nxnx, если не трудно можешь пожалуйста на интеловский ассемблер перевести
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.04.2012, 22:43     Как получить размер функции? #9
А зачем оно вообще нужно?
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
06.04.2012, 22:54     Как получить размер функции? #10
полагаю, нужно в коде функции искать опкод инструкции ret.
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
07.04.2012, 06:45     Как получить размер функции? #11
Цитата Сообщение от niXman Посмотреть сообщение
олагаю, нужно в коде функции искать опкод инструкции ret.
Если в функции несколько инструкций ret то размер будет неточным

Цитата Сообщение от Van111 Посмотреть сообщение
если не трудно можешь пожалуйста на интеловский ассемблер перевести
как такое сделать для борландовских компиляторов я не знаю. но синтаксис вроде и так почти/интеловский

з.ы. можно ещё попробовать так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
void test_func(void)
{
    //asm volatile("nop");
}
void foo(void)
{
   
}
 
 
int main(void)
{
    
    test_func();
    printf("Start_adress: %p, size: %u\n",test_func,(size_t)foo-(size_t)test_func);
    return 0;
}
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
07.04.2012, 14:23  [ТС]     Как получить размер функции? #12
а кто знает дериктивы которые бы размещали функции в том порядке в котором они встречаются в коде, и точно в том же порядке размещали данные в сегменте данных.

Добавлено через 8 минут
объясните странность
void MyMessage()
{
MessageBox(0,"OK","OK",MB_OK );
return;
}
MessageBox весит 5 байт, return 1 получаем 6, всё правильно
но если убрать MessageBox размер равен двум, как так??
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
07.04.2012, 14:41     Как получить размер функции? #13
а кто знает дериктивы которые бы размещали функции в том порядке в котором они встречаются в коде, и точно в том же порядке размещали данные в сегменте данных.
помоему таких директив не существует.
компилятор вправе делать ассемблерный код по своему усмотрению.
Вот ассемблерный код он не переиначит...

объясните странность
Все старнности решаются через дизассемблирование функций. В борланде это помоему сделать проще некуда.

пример(mingw, синтаксис intel):


код 1
C
1
2
3
4
5
void MyMessage()
{
MessageBox(0,"OK","OK",MB_OK );
return;
}

дизазм 1 (размер 47)

Код
MyMessage()
MyMessage+0: push   ebp
MyMessage+1: mov    ebp,esp
MyMessage+3: sub    esp,0x18
!MessageBox(0,"OK","OK",MB_OK );
MyMessage+6: mov    DWORD PTR [esp+0xc],0x0
MyMessage+14: mov    DWORD PTR [esp+0x8],0x403064
MyMessage+22: mov    DWORD PTR [esp+0x4],0x403064
MyMessage+30: mov    DWORD PTR [esp],0x0
MyMessage+37: call   0x401b88 <MessageBoxA@16>
MyMessage+42: sub    esp,0x10
!return;
!}
MyMessage+45: leave  
MyMessage+46: ret


код 2
C
1
2
3
4
5
void MyMessage()
{
//MessageBox(0,"OK","OK",MB_OK );
return;
}

дизазм 2 (размер 5)
Код
MyMessage()
MyMessage+0: push   ebp
MyMessage+1: mov    ebp,esp
!//MessageBox(0,"OK","OK",MB_OK );
!return;
!}
MyMessage+3: pop    ebp
MyMessage+4: ret
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 20:30     Как получить размер функции?
Еще ссылки по теме:

C++ Получить размер больших файлов
C++ WinAPI Как получить адрес функции в DLL
Получить массив char и его размер из функции - Указатель не меняется вне функции C++ WinAPI
C++ Получить размер вектора
C++ Как получить значение из функции?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.04.2012, 20:30     Как получить размер функции? #14
Цитата Сообщение от nxnx Посмотреть сообщение
ассемблерный код он не переиначит...
и то, только в том случае, если он помечен как volatile
Yandex
Объявления
07.04.2012, 20:30     Как получить размер функции?
Ответ Создать тему
Опции темы

Текущее время: 11:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru