如何解决在bpf过滤器中,双与号有什么作用?
我正在阅读linux内核中的bpf(伯克利数据包过滤器)核心部分,在以下内容中我有些困惑。
这是代码的一部分:
static unsigned int ___bpf_prog_run(u64 *regs,const struct bpf_insn *insn,u64 *stack)
{
u64 tmp;
static const void *jumptable[256] = {
[0 ... 255] = &&default_label,/* Now overwrite non-defaults ... */
/* 32 bit ALU operations */
[BPF_ALU | BPF_ADD | BPF_X] = &&ALU_ADD_X,[BPF_ALU | BPF_ADD | BPF_K] = &&ALU_ADD_K,[BPF_ALU | BPF_SUB | BPF_X] = &&ALU_SUB_X,[BPF_ALU | BPF_SUB | BPF_K] = &&ALU_SUB_K,
所以,我想知道的是双重“&”号的作用。我已经知道C ++中的右值引用,但是它是C,而不是C ++,不是吗?
非常感谢您的帮助!
解决方法
即使这是C ++,&&ALU_ADD_X
等都是表达式,而不是类型,所以&&
不能表示右值引用。
如果向下滚动,您会发现所有ALU_*
和default_label
都是标签。
您还会发现一个goto *jumptable[op];
,其中op
是一个数字。
GCC具有扩展名,您可以在其中将标签的“地址”作为值并将其用作goto
的目标。&&
是产生这样一个值的运算符。
一个简短的例子:
void example()
{
void* where = test_stuff() ? &&here : &&there;
goto *where;
here:
do_something();
return;
there:
do_something_else();
}
the documentation中有更多信息(除非您知道所要查找的内容,否则几乎找不到)。
,请参阅此文档。
http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
它喜欢gcc非标准语法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。