Tcpdump BPF语法模糊

时间:2016-02-01 19:06:05

标签: parsing syntax grammar ambiguous-grammar bpf

在tcpdump / libpcap语法中观察这些BPF过滤器行:

1: not host x or host y
2: not (host x or host y)
3: not (host x or y)
4: not host x or y
5: (not host x) or host y
6: (not host x) or y

我认为主机z与上述所有内容相匹配(除了6之外,因为它的语法无效)。 我的问题是第4行.tcpdump程序看到它等于5,但我认为这不直观,因此不正确。 第5行是明确的,第3行也是明确的。然而,第4行可以表示两种情况,具体取决于您对事物的看法。我认为,因为你不能分别看到"主持人"关键字,将第4行视为第5行是错误的。

这背后的解析逻辑是什么?谁能解释为什么1 == 4 == 5以及为什么2!= 4和3!= 4?

1 个答案:

答案 0 :(得分:1)

"我认为这不直观,因此不正确。"

也许。但通常直觉是旁观者的眼睛,精确的规范总是比#34更有用;解析器做直观的事情"。 (除非你喜欢Perl,否则我认为。但是你需要正确的直觉。)

话虽如此,我无法找到pcap语法的精确规范,但是man pcap-filter确实解释了如何用布尔运算符的基元组合消除表达式:

  

否定具有最高优先级。交替和连接具有相同的优先权,并且从左到右相关联。

许多基元由关键字后跟标识符组成,但关键字可以省略:

  

如果给出的标识符没有关键字,则假定使用最新的关键字。

这对分组没有影响。插入ignored关键字而不更改解析。这个例子清楚地表明了这一点:

  

例如,
   not host vs and ace
  是的    not host vs and host ace
  不应该与
混淆    not ( host vs or ace )

描述没有真正说明的是你的例子6是语法错误的原因,即在括号内递归执行解析,因此括号表达式内的关键字不会改变&#34 ;最新的关键字"。