有没有一种聪明的(er)方法来"bounds check"普通 C 中的函数指针?



回溯信息:

当有这样的状态机/调度器时:

switch (var)
{
case 1:
foo();
var = 2;
break;
case 2:
bar();
var = fuu();
break;
case 3:
foobar();
var = 1;
break;
default:
var = 1;
break;
}

当默认情况与任何现有情况都不匹配时,该默认情况将始终与CCD_。

假设我想根据自己的喜好,通过设置一个函数指针指向foo()bar()foobar()来做同样的事情。像这样:

void (*fun_ptr)(void);
if (<some condition>)
{
fun_ptr = foo;
}
else
{
fun_ptr = bar;
}

并通过所述函数指针调用所选择的函数,如下:

fun_ptr();

问题:

唯一的方法(我能想到(,验证functionpointer是否真的指向了其中一个给定的函数,就是手动浏览它们的地址列表,检查我是否找到了匹配项,或者在找不到匹配项时将其设置为例如foo。我知道,如果程序没有以错误的方式操作指针,就不应该有不指向其中一个函数的方法,但让我们假设它改变了毒性。

有没有更有效/更优雅的方法可以做到这一点?

C标准没有提供任何方法来测试函数指针,以确定它是否指向函数列表中的一个,而不是将其单独与每个函数的地址进行比较。函数或其他操作不存在关系运算(<<=>=>(。

您可以控制程序中指针的每次初始化和分配,因此可以在初始化或分配发生的每个点记录指针是否正在初始化或分配给感兴趣的函数之一。这些信息可以记录在标志对象(布尔值或给定值0或1的整数(中,然后您可以通过测试标志来确定指针的当前状态。

超越C标准,您可能能够安排感兴趣的函数一起位于内存中,然后您可以通过将指针转换为var0来对其应用关系测试,以查看它是否在函数跨越的地址内。这样做的能力取决于链接器和构建工具以及源代码的某些方面,例如函数是否在单独的翻译单元中定义。通常,对于如上所述可以解决的问题,这种方法是不值得的。

最新更新