这样使用C函数指针安全吗?

时间:2019-07-15 11:30:32

标签: c polymorphism

源代码示例为:

int add2(int a0, int a1)
{
    return a0+a1;
}

int add4(int a0, int a1, int a2, int a3)
{
    return a0+a1+a2+a3;
}

int (*fptr)(int a0,int a1,int a2,int a3,int a4,int a5,int a6,int a7);

int main()
{
    volatile int ret0;
    int a0=0;
    int a1=1;
    int a2=2;
    int a3=3;
    int a4=4;
    int a5=5;
    int a6=6;
    int a7=7;

    fptr = add4;
    ret0=fptr(a0,a1,a2,a3,a4,a5,a6,a7);

    return ret0;
}

在此示例中,我们具有带有8个参数的函数指针。 我正在为该指针分配包含4个参数的函数的指针。 在这种情况下,编译器可能会生成汇编代码,该汇编代码将使用目标函数中未使用的堆栈和寄存器(带有4个参数)。 分配和使用参数少于函数指针的函数地址是否合法? 使用这样的编程模式安全吗?

2 个答案:

答案 0 :(得分:3)

分配有效:

fptr = add4;

C17 :: 6.3.2.3 :: 8:

  

指向一种类型的函数的指针可以转换为指向   另一种功能并再次返回;结果应进行比较   等于原始指针。如果使用转换后的指针来调用   一个类型与所引用类型不兼容的函数,   行为是不确定的。

但是,仅将其存储为其他函数指针是有效的,而不能使用它(实际上是调用函数):

ret0 = fptr(a0, a1, a2, a3, a4, a5, a6, a7);

C17 :: 6.5.2.2 :: Constraints.2:

  

如果表示被调用函数的表达式的类型为   包括原型,论据的数量应与   参数数量。每个参数的类型应使其   值可以分配给具有非限定版本的对象   相应参数的类型。

链接:Where do I find the current C or C++ standard documents?

答案 1 :(得分:2)

  

分配和使用参数少于函数指针的函数地址合法吗?

否,函数指针应具有与基础函数相同的参数类型和数量。

参考http://port70.net/~nsz/c/c99/n1256.html#6.5.16.1

以下约束适用于简单分配

  • ...
  • 两个操作数都是指向兼容类型的合格或不合格版本的指针,并且左侧指向的类型具有右侧指向的类型的所有限定符;
  • ..