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_Sumfp неявно брошен к 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