exponenta event banner

Ненадежное приведение указателя функции

Указатель функции, приведенный к указателю другой функции с другим аргументом или возвращаемым типом

Описание

Этот дефект возникает при приведении указателя функции к указателю другой функции, имеющему другой аргумент или возвращаемый тип.

Этот дефект применяется только в том случае, если для проекта используется язык кода C.

Риск

Если поместить указатель функции на другой указатель функции с другим аргументом или возвращаемым типом, а затем использовать последний указатель функции для вызова функции, поведение не будет определено.

Зафиксировать

Избегайте приведения между двумя указателями функций с несоответствием в аргументах или возвращаемых типах.

См. примеры исправлений ниже.

Если вы не хотите устранять проблему, добавьте комментарии к результату или коду, чтобы избежать другой проверки. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.

Примеры

развернуть все

#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++
По умолчанию: Вкл.
Синтаксис командной строки: FUNC_CAST
Воздействие: среднее
Представлен в R2013b