Проблема
Вызов через несмоделированный указатель функции обнаруживает вызов функции через указатель без прототипа. Прототип функции задает тип и количество параметров.
Риск
Аргументы, переданные функции без прототипа, не могут совпадать с номером и типом параметров функционального определения, которое может вызвать неопределенное поведение. Если параметры ограничиваются подмножеством своей области типа, аргументы из недоверяемых источников могут инициировать уязвимости в вызванной функции.
Фиксация
Прежде, чем вызвать функцию через указатель, обеспечьте прототипа функции.
Пример - аргумент не совпадает с ограничением параметра
#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);
}