Closures/Value capture: Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 26: | Line 26: | ||
<lang c>#include <stdio.h> |
<lang c>#include <stdio.h> |
||
⚫ | |||
#include <string.h> |
#include <string.h> |
||
⚫ | |||
#include <sys/mman.h> |
|||
typedef int (*f_int)(); |
typedef int (*f_int)(); |
||
#define TAG 0xdeadbeef |
#define TAG 0xdeadbeef |
||
int _tmpl() { |
int _tmpl() { |
||
Line 37: | Line 38: | ||
} |
} |
||
#define PROT (PROT_EXEC | PROT_WRITE) |
|||
#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS) |
|||
f_int dupf(int v) |
f_int dupf(int v) |
||
{ |
{ |
||
size_t len = (void*)dupf - (void*)_tmpl; |
size_t len = (void*)dupf - (void*)_tmpl; |
||
f_int ret = |
f_int ret = mmap(NULL, len, PROT, FLAGS, 0, 0); |
||
char *p; |
char *p; |
||
if(ret == MAP_FAILED) { |
|||
perror("mmap"); |
|||
exit(-1); |
|||
} |
|||
memcpy(ret, _tmpl, len); |
memcpy(ret, _tmpl, len); |
||
for (p = (char*)ret; p < (char*)ret + len - sizeof(int); p++) |
for (p = (char*)ret; p < (char*)ret + len - sizeof(int); p++) |
||
Line 47: | Line 54: | ||
return ret; |
return ret; |
||
} |
} |
||
int main() |
int main() |
||
{ |
{ |
||
Line 53: | Line 60: | ||
int i; |
int i; |
||
for (i = 0; i < 10; i++) funcs[i] = dupf(i); |
for (i = 0; i < 10; i++) funcs[i] = dupf(i); |
||
for (i = 0; i < 9; i++) |
for (i = 0; i < 9; i++) |
||
printf("func[%d]: %d\n", i, funcs[i]()); |
printf("func[%d]: %d\n", i, funcs[i]()); |
||
return 0; |
return 0; |
||
}</lang>output<lang>func[0]: 0 |
}</lang>output<lang>func[0]: 0 |