主要内容

不可靠的函数指针转换

将函数指针转换为具有不同参量或返回类型的另一个函数指针

描述

将函数指针转换为具有不同参量或返回类型的另一个函数指针时,会发生此缺陷。

风险

如果将一个函数指针转换为具有不同参量或返回类型的另一个函数指针,然后使用后一个函数指针去调用一个函数,则该行为是未定义的。

修复

避免在参量或返回类型不匹配的两个函数指针之间进行转换。

请参阅下面的修复示例。

如果您不想修复该问题,可以在结果或代码中添加注释,以避免再次被审查。请参阅:

示例

全部展开

#include <stdio.h>
#include <math.h>
#define PI 3.142
 
double Calculate_Sum(int (*fptr)(double))
{
    double  sum = 0.0;
    double  y;
	  
    for (int i = 0;  i <= 100;  i++)
    {
        y = (*fptr)(i*PI/100);
        sum += y;
    }
    return sum / 100;
}
 
int main(void)
{
    double  (*fp)(double);      
    double  sum;
 
    fp = sin;
    sum = Calculate_Sum(fp); 
    /* Defect: fp implicitly cast to int(*) (double) */

    printf("sum(sin): %f\n", sum);
    return 0;
}

函数指针 fp 被声明为 double (*)(double)。然而,在将它传递给函数 Calculate_Sum 时,fp 被隐式转换为 int (*)(double)

更正 - 避免函数指针转换

一种可能的更正方法是检查 Calculate_Sum 定义中的函数指针是否与 fp 具有相同的参量和返回类型。此步骤确保 fp 不会被隐式转换为不同的参量或返回类型。

#include <stdio.h>
#include <math.h>
# define PI 3.142
 
/*Fix: fptr has same argument and return type everywhere*/
double Calculate_Sum(double (*fptr)(double)) 
{
    double  sum = 0.0;
    double y;
	    
    for (int i = 0;  i <= 100;  i++)
    {
        y = (*fptr)(i*PI/100);
        sum += y;
    }
    return sum / 100;
}
 
int main(void)
{
    double  (*fp)(double);      
    double  sum;
 
    
    fp = sin;
    sum = Calculate_Sum(fp);
    printf("sum(sin): %f\n", sum);
 
    return 0;
}

结果信息

组:静态内存
语言:C | C++
默认值:On
命令行语法:FUNC_CAST
影响

版本历史记录

在 R2013b 中推出