ISO/IEC TS 17961 [taintnoproto]

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

Описание

Управляйте определением

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

Примеры

развернуть все

Описание

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

Риск

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

Фиксация

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

Пример - аргумент не совпадает с ограничением параметра

#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);
} 

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

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.