В C: отправка указателей на func, вызов с ними func, игра с EIP, jmp_buf и longjmp - PullRequest
3 голосов
/ 18 мая 2010

Мне нужно убедиться, что я сначала понимаю некоторые основные вещи:

  1. как передать функцию A в качестве параметра функции B?
  2. как мне вызвать функцию A изнутри B?

Теперь для большого сглаза:

Я пытаюсь сделать что-то вроде этого:

jmp_buf buf;
buf.__jmpbuf[JB_PC] = functionA;
longjmp(buf,10);

Это означает, что я хочу использовать longjmp для перехода к функции. Как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 18 мая 2010

Вам нужно использовать указатель на функцию.Синтаксис объявления указателя функции:

rettype (*)(paramtype1,paramtype2,...,paramtypeN)

Так, например, у нас может быть следующий код:

char functionA(int x)
{
      printf("%d\n",x):
      return 'a';
}

char functionB(char (*f)(int), int val)
{
       return f(val); // invokes the function pointer
}

int main(int argc, char* argv[])
{
       char result = functionB(&functionA,3); // prints "3"
       printf("%c\n",result); // prints 'a'
       return 0;
}

Кроме того, отметим, что в то время как & functionA принимаетадрес функции A, на самом деле нет необходимости использовать амперсанд там ... Я лично делаю это, так как я думаю, что это делает более ясным, что это указатель на функцию.Вы вызываете указатель на функцию, используя тот же синтаксис, что и при вызове функции.

Что касается использования буферов перехода, я считаю, что то, что вы делаете, не является чем-то, на что можно положиться.Если вы хотите создать буфер перехода и вызвать setjmp перед вызовом какой-либо функции, затем позже вызовите longjmp, чтобы вы вернулись к нему непосредственно перед вызовом, тогда это будет четко определено.Фактическое определение и структура jmp_buf, тем не менее, зависят от реализации.Существуют определенные требования, которым он должен соответствовать (например, это должен быть тип массива, поскольку setjmp должен иметь возможность принимать его по значению и все же изменять его), но кроме этого, спецификация для setjmp.h не определяет структуру jmp_buf.Итак, все, что пытается манипулировать jmp_buf напрямую, будет специфичным для конкретной платформы.

0 голосов
/ 18 мая 2010
  1. Передача функции A в качестве параметра функции B:

    typedef void function_type (void);

    void functionA (void) { printf («Это функция A \ n»); }

    int main (int argc, char ** argv) { functionB (& functionA); возврат (0); }

  2. Вызов функции A из функции B:

    void functionB (function_type * func) { FUNC (); }

  3. Использование longjmp() для перехода к функции. Лучший ответ - «Не делай этого» - почти всегда есть лучший способ достичь той же цели. Можете ли вы объяснить ситуацию, где вам это нужно?

...