ПроблемаНенадежное приведение указателя на функцию происходит, когда указатель на функцию приведен к другому указателю на функцию, который имеет другой аргумент или возвращаемый тип.
Этот дефект применяется только в том случае, если языком кода для проекта является C.
РискЕсли вы приведете указатель на функцию к другому указателю на функцию с другим аргументом или возвращаемым типом, а затем используете последний указатель на функцию для вызова функции, поведение не определено.
ЗафиксироватьИзбегайте приведения между двумя указателями на функцию с несовпадением аргументов или возвращаемых типов.
См. примеры исправлений ниже.
Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
Пример - Ненадежное приведение ошибки указателя на функцию#include <stdio.h>
#include <math.h>
#include <stdio.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>
#include <stdio.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;
}