繁体   English   中英

双&符号在 bpf 过滤器中有什么作用?

[英]What does double ampersand do in bpf filter?

我正在阅读 linux 内核中的 bpf(berkeley packet filter) 核心部分,下面我有点困惑。
这是代码的一部分:

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();
}

文档中有更多信息(除非您知道要查找的内容,否则几乎不可能找到)。

看到这个文件。

http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

它喜欢 gcc 非标准语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM