R0 CREW

"размер" функции

Имеем

void main (void)
{
         func();
}

void func (void)
{
     тут много букв и кода
}

Вопрос, какие есть вариант получения размера func способами С (на асм не считается)

Зависит от компилятора, но функции должны идти последовательно.

Отключи оптимизацию и добавь еще одну функцию:

void main (void)
{
         [B][COLOR="red"]int size = func_end - func;[/COLOR][/B]

         func();
}

void func (void)
{
         тут много букв и кода
}

[B][COLOR="red"]void func_end(void)[/COLOR][/B]
{
         тут много букв
}

Такой способ я знаю.
Еще какие есть?

Это что для нового крякми? )

Более элегантного решения я не знаю. Как вариант подключить дизассемблерный движок.

вот что мне удалось найти за минуту…

Hide

Велик, пост 2 Девид Эмпсон

Hide

Сабжевый примерчик, но не идеал…

Пример с вычитанием указателей не всегда будет корректный результат давать - выравнивание и все дела… Я бы вынес интересующую ф-цию в отдельный файл, а процесс компиляции построил бы так, чтобы сначала компилировался файл с ф-цией, потом парсер OBJ файла вытаскивает размер этой ф-ции и передает в качестве define остальным компилируемым модулям.

P.S. ну а кто-то может и плагин для компилятора написать(если компилятор поддерживает)

Вообщем дело ясное что без асма тут никак )

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

В большинстве случаев - да, не критично. Зависит от того, как и что использовать. Например, если передавать ф-цию на ассемблере(пошифрованную?) в качестве ключа(или части ключа), а в код встроить “проверку” ключа - на стандартный пролог, например, то важно не зацепить в начале никакие команды выравнивания.

Т.е. надо просто помнить, что команды выравнивания могут присутствовать.

можно использовать emit, потом глядеть на размер по сигнатуре