Здравствуйте! Есть задача - спрятать адрес функции в программе, чтобы при статическом анализе "злоумышленник" не смог найти места вызова этой функции.
С переменными (глобальными) я делал так:
char gStr[] = "Hello Toster!"; // Глобальная переменная
Далее где-нибудь в функции:
void foo(int a)
{
char *str = gStr + 10;
...
puts(str-a); // параметр a - всегда равен 10
}
Смысл был в том, что при компиляции выражение
gStr + 10, содержащее две константы, будет автоматически посчитано (а результат будет присвоен в str) и в будущем, если кому-либо удастся найти адрес gStr - он не найдет место, где она была использована.
Я хотел сделать тоже самое с функциями: взял функцию foo(из примера выше) и попробовал сделать на нее указатель со смещением:
void foo2(int a)
{
void (*fptr)(int) = (void(*)(int)) &((int*)f)[3]; // сложная конструкция :(((
// void (*fptr)(int) = (void(*)(int)) (f+3); // пробовал и так
...
}
Но компилятор упорно не хочет вычислять выражение
&((int*)f)[3] при компилировании. Хотя имя функции - это константа на момент компиляции.
Подскажите - в чем проблема и как быть? Заранее спасибо!)
PS Компилировал в Visual Studio 2012 под win32. Пробовал и debug и release. Пример с константой работал всегда, с функцией - никогда.