#include <stdio.h>
#include <limits.h>
#define SIZE2 2
typedef void (*func_ptr)();
extern int getchar_wrapper(void);
extern void restricted_int_sink(int i);
/* Integer value restricted to
range [-1, 255] */
extern void restricted_float_sink(double i);
/* Double value restricted to > 0.0 */
func_ptr generic_callback[SIZE2] =
{
(func_ptr)restricted_int_sink,
(func_ptr)restricted_float_sink
};
void func(void)
{
int ic;
ic = getchar_wrapper();
/* Wrong index used for generic_callback.
Negative 'int' passed to restricted_float_sink. */
(*generic_callback[1])(ic);
}
В этом примере вызов через func_ptr
проходит ic
как аргумент для функции generic_callback[1]
. Тип ic
может иметь отрицательные значения, в то время как параметр generic_callback[1]
ограничено значениями с плавающей точкой, больше 0.0
. Обычно компиляторы и инструменты статического анализа не могут выполнять проверку типа, если вы не предоставляете прототип указателя.
Коррекция - Обеспечьте прототип указателя на функциюПередайте аргумент ic
к функции с параметром типа int
, при помощи правильно прототипированного указателя.
#include <stdio.h>
#include <limits.h>
#define SIZE2 2
typedef void (*func_ptr_proto)(int);
extern int getchar_wrapper(void);
extern void restricted_int_sink(int i);
/* Integer value restricted to
range [-1, 255] */
extern void restricted_float_sink(double i);
/* Double value restricted to > 0.0 */
func_ptr_proto generic_callback[SIZE2] =
{
(func_ptr_proto)restricted_int_sink,
(func_ptr_proto)restricted_float_sink
};
void func(void)
{
int ic;
ic = getchar_wrapper();
/* ic passed to function through
properly prototyped pointer. */
(*generic_callback[0])(ic);
}