如何解决有没有一种聪明的er方法来“边界检查”普通 C 中的函数指针?
背景信息:
当有这样的状态机/调度器时:
CmdLet
当默认情况与任何现有情况不匹配时,它总是会修正 public abstract class QboCmdlet : PSCmdlet
{
protected static ServiceProvider Services
{
get
{
if (_services == null)
{
_services = new ServiceCollection()
// other stuff here
.AddLogging(options =>
{
// todo: inject a CmdLetLogger,but we need a CmdLet; how to detect?
// options.AddProvider(new CmdLetLoggerProvider());
})
.BuildServiceProvider();
}
return _services;
}
}
}
。
假设我想根据我的喜好将函数指针设置为指向 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;
}
每当我找不到的时候。我知道如果程序没有以错误的方式操作指针,那么它不应该指向一个函数,而是假设它改变了它的可能性。
有没有更有效/更优雅的方法来做到这一点?
解决方法
C 标准没有提供任何方法来测试函数指针以确定它是否指向函数列表中的一个,而是通过将其与每个函数的地址单独进行比较。对于执行此操作的函数或其他操作,没有关系操作(<
、<=
、>=
、>
)。
您可以控制程序中指针的每次初始化和分配,因此可以在初始化或分配发生的每个点记录指针是否正在初始化或分配给感兴趣的函数之一。可以将这些信息记录在一个标志对象中(一个布尔值或一个给定值为 0 或 1 的整数),然后您可以通过测试标志来确定指针的当前状态。
超越 C 标准,您也许可以将感兴趣的函数安排在内存中,然后您可以通过将指针转换为 uintptr_t
来对指针应用关系测试,看看它是否位于函数跨越的地址内。执行此操作的能力取决于您的链接器和构建工具以及源代码的某些方面,例如函数是否在单独的翻译单元中定义。通常,对于可以如上所述解决的问题,这种方法是不值得的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。