函数指针值的分段错误



如果错误地设置了函数指针的值,是否可以打开Segmentation Fault

还是解释器/编译器会事先检测到这一点?

细节取决于您使用的语言,但总的来说,这不仅是可能的,而且是可能的。

C不提供任何保证。 你可以说例如

#include <stddef.h>
typedef void (*foo)( void );
int main( void ) {
((foo)NULL)( );
return 0;
}

它需要NULL,将其强制转换为函数并调用它(或至少尝试,并崩溃)。 在撰写本文时,gcc -Wallclang -Wall都不会发现或警告这种病理病例。

对于其他语言,可能会有更多的保护措施。但一般来说,不要指望你的程序能够在糟糕的函数指针中幸存下来。

void  (*ptr)() = (void (*) ())0x0;
ptr();

没有什么能阻止你编译/执行它,但它肯定会失败。

以下示例生成您提到的分段错误:

int main(int argc, char *argv[]) {
void (*fun_ptr)() = (void (*)()) 1;
(*fun_ptr)();
return 0;
}

抄送、叮当声、夹板均未发出警告。C 假设程序员知道他在做什么。

更新

以下参考说明了为什么 C 允许通过指针访问绝对内存寻址。

Koenig, Andrew R., C Traps an Pitfalls, Bell Telephone Laboratories, Murray Hill, New Jersey, Technical Memorandum, 2.1.了解声明:

我曾经和一个正在编写C程序的人交谈过,他将 在小型微处理器中独立运行。当这台机器是 打开后,硬件将调用地址为 存储在位置 0。

为了模拟打开电源,我们必须设计一个 C 语句 这将显式调用此子例程。经过一番思考,我们 提出了以下几点:

(*(void(*)())0)();

相关内容

  • 没有找到相关文章

最新更新