Указатель на функцию, размещенный в куче - PullRequest
0 голосов
/ 02 мая 2019

Я хочу объявить указатель на локальную функцию, выделить место для указателя в куче, указать на него различные функции на лету.

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<unistd.h>

void fun(){
 printf("fun");
}

typedef void(*fp)();

int main(){
 fp f; //local pointer
 f = malloc(sizeof(f)); //allocate space for a pointer on the heap
 (*f) = &fun; //write the address of fun into the space allocated in heap
 (*f)(); // so that the contents in f, is the address of fun
}

Но я получаю ошибку компиляции на (*f) = &fun;что гласит: error: lvalue required as left operand of assignment.Как мне сделать это правильно?

Просто, чтобы это не выглядело как проблема xy: я хочу воспроизвести упомянутый здесь эксплойт: Использовать после свободного эксплойта

1 Ответ

4 голосов
/ 02 мая 2019

Вы не можете присвоить *fp, потому что это выражение имеет тип функции.

fp предназначено для хранения указателя, в данном случае указателя на функцию.Так что вам не нужно ничего выделять.Просто назначьте адрес функции:

fp f;
f = &fun;
(*f)();

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

fp f;
f = fun;
f();

РЕДАКТИРОВАТЬ:

Если вы действительно хотите динамически распределять пространство для указателя функции, то вам нужен указатель на указатель функции для его хранения:

fp *f;                   // fp is void (*)(), so f is void(**)()
f = malloc(sizeof(*f));  // allocate space for function pointer
*f = func;
(*f)();     // func called

free(f);
fp *g;
g = malloc(sizeof(*g));   // possibly points to what f pointed to?
*g = evil_f;

(*g)();    // evil_func called

Обратите внимание, чтовышеуказанное вызывает неопределенное поведение и будет работать только на реализациях, которые не оптимизируют значение, хранящееся в f, и повторно используют ту же область памяти для присвоения g.

...