所以,我知道这个问题以前曾被问过。我仍然不了解以下内容:
#include <stdio.h>
main() {
volatile int (*fp)();
char buffer[64];
fp = 0;
if(fp){
printf("Buffer Overflow, jumping to %p", fp);
fp();
}
}
第一行声明函数指针fp。第三行向函数指针建议值0,该值应等于地址0(&0
)。现在,这就是指针指向的内存地址的内容。因此,if陈述永远都不会成真。尽管如此,应该变为现实,它将被执行。如果执行了该命令,printf函数将打印现在存储在指针fp中的地址。
但是最后一行(fp()
)在做什么?对我来说,似乎我在尝试调用函数fp(),指针fp指向该地址。但是此函数尚未在此代码中定义。那么,这是在做什么呢?
答案 0 :(得分:1)
volatile
限定符表示fp
的值可能会在此函数的代码控制范围之外随时更改(这会阻止编译器执行某些操作fp
的优化)。实际上,您可以在已被内存映射的对象上使用限定符,或者可以通过中断来修改全局对象,或者类似的方法。在这种特定情况下,没有理由期望fp
被此代码外部的内容所更改。
但是,代码的目的是将 if fp
更改为非NULL
值(即设置为指向函数),然后此代码将打印该指针值,然后执行所指向的函数。
答案 1 :(得分:0)
此“代码”假定使用C标准保证的内容。
fp = 0;
-为FP分配NULL指针(并发出警告)
您应该使用fp = NULL;
,或者如果不确定NULL指针在内存中的内部表示形式(在您的实现中为零),fp = (int (*)())0;
现在,程序假定将fp放在 之后的缓冲区中,这是C语言无法保证的。实现可以按自己的方式对变量进行排序。
但是即使假设该顺序-如果将缓冲区写出边界(但只有在缓冲区大小小于sizeof(fp)并且写入的数据不为零的情况下,缓冲区才会起作用),fp
不会变为空值。但是您不能调用它,因为它将包含一个随机地址,并且您的程序将崩溃