メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

関数ポインターの信頼性の低いキャスト

関数ポインターの、引数または戻り値の型が異なる別の関数ポインターへのキャスト

説明

この欠陥は、関数ポインターが引数または戻り値の型が異なる別の関数ポインターにキャストされた場合に発生します。

リスク

関数ポインターを引数または戻り値の型が異なる別の関数ポインターにキャストし、後者の関数ポインターを使用して関数を呼び出した場合、動作は未定義になります。

修正方法

引数または戻り値の型が一致しない 2 つの関数ポインター間のキャストは避けます。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する

#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;
}

関数ポインター fpdouble (*)(double) として宣言されています。しかし、関数 Calculate_Sum に渡す時に fp は暗黙的に int (*)(double) にキャストされます。

修正 — 関数ポインターのキャストを回避

1 つの修正方法として、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++
既定値: オン
コマンド ライン構文: FUNC_CAST
影響度: Medium

バージョン履歴

R2013b で導入