函数指针值的分段错误

时间:2015-05-08 22:04:58

标签: pointers segmentation-fault

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

或者解释器/编译器会事先检测到吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

详细信息取决于您使用的语言,但一般来说,这不仅仅是可能的,而且很可能。

C不提供任何保证。你可以这样说。

#include <stddef.h>

typedef void (*foo)( void );

int main( void ) {
    ((foo)NULL)( );
    return 0;
}

NULL,将其转换为函数并调用它(或者至少尝试并崩溃。)截至撰写时,gcc -Wallclang -Wall都不会检测到警告即使是这种病态的案例。

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

答案 2 :(得分:1)

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

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

cc,clang,splint都没有发出警告。 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)();