2016-02-01 3 views
0

Соблюдайте эти строки фильтров BPF в синтаксисе ТСРйитр/Libpcap:Tcpdump 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 

Это мое мнение, что хозяин г соответствует всем вышеперечисленным (за исключением 6, потому что один имеет недопустимый синтаксис). Моя проблема связана с строкой 4. Программа tcpdump видит, что она эквивалентна 5, но я думаю, что это неинтуитивно и, следовательно, неверно. Строка 5 однозначна, как и линия 3. Однако строка 4 может означать обе вещи, в зависимости от того, как вы смотрите на вещи. Я считаю, что, поскольку вы не можете видеть y отдельно от ключевого слова «хозяин», неправильно обрабатывать строку 4, как строка 5.

Что такое логика синтаксического анализа позади этого? Кто может объяснить, почему 1 == 4 == 5 и почему 2! = 4 и 3! = 4?

+0

http://biot.com/capstats/bpf.html: «Отрицание имеет наивысший приоритет». (1) можно рассматривать как «(не хост x) или (хост y)», по существу. –

+0

Я согласен в этом случае (1), однако, поскольку y не может быть написано отдельно, мой мозг обрабатывает дерево разбора: не хост (x или y), потому что невозможно поставить скобки вокруг «не хост x», потому что это приводят к недопустимому синтаксису. На мой взгляд, вы всегда должны ставить скобки вокруг того, что вы имели в виду, не нарушая синтаксиса. Поэтому 4 больше похоже на 3, а не как 1. – Cheatah

ответ

1

«Я думаю, что это не интуитивно, а потому неверно».

Возможно. Но часто интуиция находится в поле зрения наблюдателя, и точная спецификация всегда более полезна, чем «парсер делает интуитивную вещь». (Если вам не нравится Perl, я полагаю, но тогда вам нужны правильные интуиции.)

Сказав это, я не могу найти точную спецификацию грамматики pcap, но man pcap-filter объясняет, как выражения устраняются в комбинации примитивы с булевыми операторами:

Отрицание имеет наивысший приоритет. Чередование и конкатенация имеют одинаковый приоритет и ассоциируются слева направо.

Многие примитивы состоят из ключевого слова, за которым следует идентификатор, но ключевое слово может быть опущен:

Если идентификатор дается без ключевого слова, предполагается, что самое последнее ключевое слово.

Это не влияет на группировку. Введенное ключевое слово вставляется без изменения синтаксического анализа. Пример делает, что ясно:

Например,
not host vs and ace
коротка для
not host vs and host ace
, который не следует путать с
not (host vs or ace)

Что описание не действительно ясно, причина в том, что ваш пример 6 является синтаксической ошибкой, которая заключается в том, что синтаксический анализ выполняется рекурсивно внутри pa ренессеины и, следовательно, ключевые слова внутри родительского выражения не меняют «самое последнее ключевое слово».

Смежные вопросы