ISO/IEC TS 17961 [taintnoproto]

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

Описание

Определение правила

Использование испорченного значения в качестве аргумента для незащищенного указателя на функцию.[1]

Реализация Polyspace

Эта проверка проверяет Вызов через не прототипированный указатель на функцию.

Примеры

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

Проблема

Вызов через не прототипированный указатель на функцию обнаруживает вызов функции через указатель без прототипа. Прототип функции задает тип и количество параметров.

Риск

Аргументы, переданные в функцию без прототипа, могут не совпадать с количеством и типом параметров определения функции, что может вызвать неопределенное поведение. Если параметры ограничены подмножеством их области type, аргументы из ненадежных источников могут вызвать уязвимости в вызываемой функции.

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

Перед вызовом функции через указатель сообщите прототип функции.

Пример - Аргумент не соответствует ограничению параметра
#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);
} 

Проверяйте информацию

Решимость: Undecidable
Введенный в R2019a

[1] Выдержки из стандарта «Техническая спецификация ISO/IEC TS 17961 - 2013-11-15» воспроизводятся с согласия АФНОР. Только оригинальный и полный текст стандарта, опубликованный AFNOR Editions - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.