メインコンテンツ

ISO/IEC TS 17961 [taintnoproto]

Using a tainted value as an argument to an unprototyped function pointer

説明

ルール定義

プロトタイプのない関数ポインターの引数として汚染された値を使用。1

Polyspace 実装

このチェッカーは、プロトタイプのない関数ポインターによる呼び出しをチェックします。

すべて展開する

問題

プロトタイプのない関数ポインターによる呼び出しは、プロトタイプのないポインターによる関数の呼び出しを検出します。関数プロトタイプは、パラメーターの型と数を指定します。

リスク

プロトタイプのない関数に渡される引数は、関数定義のパラメーターの数と型に一致しない可能性があります。その場合、未定義の動作が起こる可能性があります。パラメーターが型ドメインのサブセットに制限されている場合、信頼されていないソース由来の引数によって呼び出された関数の脆弱性がトリガーされる可能性があります。

修正方法

ポインターを介して関数を呼び出す前に、関数プロトタイプを用意します。

例 - 引数がパラメーターの制限と一致しない
#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 よりも大きい浮動小数点数に制限されています。通常、ポインター プロトタイプを用意していない場合、コンパイラと静的解析ツールではデータ型のチェックを実行できません。

修正 — 関数へのポインターのプロトタイプを用意

適切にプロトタイプされたポインターを使用して、int 型のパラメーターを取る関数に引数 ic を渡します。

#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 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.