【发布时间】:2019-03-07 00:55:41
【问题描述】:
我无法理解应该易受攻击的 C 程序的代码。
我们有这个定义typedef void (*fptr)(void);,我留下上面的部分代码。我在理解指令fptr p = pat_on_back; 时完全没有问题,它只是定义了一个 fptr 指针,该指针指向一个永远不会执行的函数,因为该指令只是定义并初始化了一个指针(对吗?)。
我的问题是理解指令fptr ptrs[3] = { NULL, get_wisdom, put_wisdom };。当 fptr 类型明显用于声明和初始化 void 数组时,这条指令是如何工作的?不应该只接收一个 void 参数吗?
就此而言,get_wisdom() 和 put_wisdom() 函数都接收和返回 void。这个小程序是填充和打印一个简单的字符链表,称为“智慧”。 get_wisdom() 和 put_wisdom() 函数完全按照它看起来的样子做。
char greeting[] = "Hello there\n1. Receive wisdom\n2. Add wisdom\nSelection >";
char prompt[] = "Enter some wisdom\n";
char pat[] = "Achievement unlocked!\n";
char secret[] = "secret key";
typedef void (*fptr)(void);
void pat_on_back(void) {
write(outfd, pat, sizeof(pat));
return;
}
void put_wisdom(void) {
. . .
}
void get_wisdom(void) {
. . .
}
fptr ptrs[3] = { NULL, get_wisdom, put_wisdom };
int main(int argc, char *argv[]) {
while(1) {
char buf[1024] = {0};
int r;
fptr p = pat_on_back;
r = write(outfd, greeting, sizeof(greeting)-sizeof(char));
if(r < 0) {
break;
}
r = read(infd, buf, sizeof(buf)-sizeof(char));
if(r > 0) {
buf[r] = '\0';
int s = atoi(buf);
fptr tmp = ptrs[s];
tmp();
} else {
break;
}
}
return 0;
}
【问题讨论】:
-
fptr是一种类型。ptrs[3]是该类型的数组。据推测,get_wisdom和put_wisdom与该类型兼容。并且类型不是void。类型为“指向不带参数且不返回任何内容的函数的指针”. -
空数组是什么意思?你的问题不清楚。请澄清。
-
我认为他/她的意思是get_wisdom是一个函数指针,它指向一个可能被定义为“void get_wisdom(void);”的函数。 ptrs[3] 是一个相同类型(定义)的函数指针数组。
-
@user3386109 但是 { NULL, get_wisdom, put_wisdom } 是一个数组,而不是一个函数,不是吗?抱歉,如果这听起来很愚蠢。
-
没有“虚空数组”这种东西
标签: c