在纯 C 中是否有智能(呃)方法 "bounds check" 函数指针?
Is there a smart(er) way to "bounds check" a function pointer in plain C?
背景信息:
当 statemachine/dispatcher 像这样时:
switch (var)
{
case 1:
foo();
var = 2;
break;
case 2:
bar();
var = fuu();
break;
case 3:
foobar();
var = 1;
break;
default:
var = 1;
break;
}
当默认案例不匹配任何现有案例时,它总是会更正 var
。
假设我想通过将函数指针设置为指向 foo()
、bar()
或 foobar()
,根据我的喜好来做同样的事情。像这样:
void (*fun_ptr)(void);
if (<some condition>)
{
fun_ptr = foo;
}
else
{
fun_ptr = bar;
}
并通过所述函数指针调用所选函数,如下所示:
fun_ptr();
问题:
验证函数指针是否确实指向那些给定函数之一的唯一方法(我能想到)是手动浏览它们的地址列表并检查我是否找到匹配项或设置它例如foo
每当我找不到一个。我知道,如果程序没有以错误的方式操作指针,就不会有它不指向其中一个函数的方法,但让我们假设它改变了可能性。
还有其他 efficient/elegant 方法吗?
C 标准没有提供任何方法来测试函数指针以确定它是否指向函数列表中的一个,除非将它单独与每个函数的地址进行比较。函数或其他操作没有关系操作(<
、<=
、>=
、>
)。
您可以控制程序中指针的每一次初始化和赋值,因此可以在初始化或赋值发生的每个点记录指针是否正在被初始化或赋值给感兴趣的函数之一。这些信息可以记录在一个标志对象中(一个布尔值或一个整数,给定值0或1),然后你可以通过测试标志来确定指针的当前状态。
超越 C 标准,您可以将感兴趣的函数安排在内存中,然后您可以通过将指针转换为 uintptr_t
来对指针应用关系测试以查看如果它在函数跨越的地址内。执行此操作的能力取决于您的链接器和构建工具以及源代码的某些方面,例如函数是否在单独的翻译单元中定义。一般情况下,对于一个按上述方法可以解决的问题,这种做法是不划算的。
背景信息:
当 statemachine/dispatcher 像这样时:
switch (var)
{
case 1:
foo();
var = 2;
break;
case 2:
bar();
var = fuu();
break;
case 3:
foobar();
var = 1;
break;
default:
var = 1;
break;
}
当默认案例不匹配任何现有案例时,它总是会更正 var
。
假设我想通过将函数指针设置为指向 foo()
、bar()
或 foobar()
,根据我的喜好来做同样的事情。像这样:
void (*fun_ptr)(void);
if (<some condition>)
{
fun_ptr = foo;
}
else
{
fun_ptr = bar;
}
并通过所述函数指针调用所选函数,如下所示:
fun_ptr();
问题:
验证函数指针是否确实指向那些给定函数之一的唯一方法(我能想到)是手动浏览它们的地址列表并检查我是否找到匹配项或设置它例如foo
每当我找不到一个。我知道,如果程序没有以错误的方式操作指针,就不会有它不指向其中一个函数的方法,但让我们假设它改变了可能性。
还有其他 efficient/elegant 方法吗?
C 标准没有提供任何方法来测试函数指针以确定它是否指向函数列表中的一个,除非将它单独与每个函数的地址进行比较。函数或其他操作没有关系操作(<
、<=
、>=
、>
)。
您可以控制程序中指针的每一次初始化和赋值,因此可以在初始化或赋值发生的每个点记录指针是否正在被初始化或赋值给感兴趣的函数之一。这些信息可以记录在一个标志对象中(一个布尔值或一个整数,给定值0或1),然后你可以通过测试标志来确定指针的当前状态。
超越 C 标准,您可以将感兴趣的函数安排在内存中,然后您可以通过将指针转换为 uintptr_t
来对指针应用关系测试以查看如果它在函数跨越的地址内。执行此操作的能力取决于您的链接器和构建工具以及源代码的某些方面,例如函数是否在单独的翻译单元中定义。一般情况下,对于一个按上述方法可以解决的问题,这种做法是不划算的。