Unreliable cast of function pointer

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

Описание

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

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

Риск

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

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

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

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

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

Примеры

расширить все

#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