Wireshark-dev: Re: [Wireshark-dev] Display filter and/or precedence
From: Jakub Zawadzki <darkjames-ws@xxxxxxxxxxxx>
Date: Fri, 9 Aug 2013 22:47:41 +0200
On Fri, Aug 09, 2013 at 09:46:29PM +0200, Jakub Zawadzki wrote: > On Fri, Aug 09, 2013 at 12:26:53PM -0700, Guy Harris wrote: > > > but +1 for being consistent with the rest of the world. > > > > Yes. > > I'd rather not change grammar, still I think what we need - is some warning: > "suggest parentheses around '&&' within '||'" Can anyone look at attached patch? It seems to be working OK...
diff --git a/epan/dfilter/dfilter.c b/epan/dfilter/dfilter.c index bef5e7e..dc669e1 100644 --- a/epan/dfilter/dfilter.c +++ b/epan/dfilter/dfilter.c @@ -318,7 +318,7 @@ dfilter_compile(const gchar *text, dfilter_t **dfp) else { /* Check semantics and do necessary type conversion*/ - if (!dfw_semcheck(dfw)) { + if (!dfw_semcheck(dfw, deprecated)) { goto FAILURE; } diff --git a/epan/dfilter/grammar.lemon b/epan/dfilter/grammar.lemon index 88c59b6..a808d1b 100644 --- a/epan/dfilter/grammar.lemon +++ b/epan/dfilter/grammar.lemon @@ -309,5 +309,6 @@ funcparams(P) ::= funcparams(L) COMMA entity(E). expr(X) ::= LPAREN expr(Y) RPAREN. { X = Y; + stnode_set_bracket(X, TRUE); } diff --git a/epan/dfilter/semcheck.c b/epan/dfilter/semcheck.c index 47dd748..0e572f1 100644 --- a/epan/dfilter/semcheck.c +++ b/epan/dfilter/semcheck.c @@ -49,7 +49,7 @@ #endif static void -semcheck(stnode_t *st_node); +semcheck(stnode_t *st_node, GPtrArray *deprecated); static stnode_t* check_param_entity(stnode_t *st_node); @@ -1214,7 +1214,7 @@ header_field_info *hfinfo; /* Check the semantics of any type of TEST */ static void -check_test(stnode_t *st_node) +check_test(stnode_t *st_node, GPtrArray *deprecated) { test_op_t st_op; stnode_t *st_arg1, *st_arg2; @@ -1236,13 +1236,38 @@ check_test(stnode_t *st_node) break; case TEST_OP_NOT: - semcheck(st_arg1); + semcheck(st_arg1, deprecated); break; case TEST_OP_AND: case TEST_OP_OR: - semcheck(st_arg1); - semcheck(st_arg2); + while (stnode_type_id(st_arg1) == STTYPE_TEST && stnode_type_id(st_arg2) == STTYPE_TEST) { + test_op_t st_arg1_op, st_arg2_op; + + /* Warn user */ + /* st_node->deprecated_token = "suggest parentheses around '&&' within '||'";; */ + /* XXX, don't duplicate this message, iterate over and don't add if already exists */ + + sttype_test_get(st_arg1, &st_arg1_op, NULL, NULL); + if (st_arg1_op == TEST_OP_AND || st_arg1_op == TEST_OP_OR) { + if (st_op != st_arg1_op && !st_arg1->inside_brackets) { + g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'")); + break; + } + } + + sttype_test_get(st_arg2, &st_arg2_op, NULL, NULL); + if (st_arg2_op == TEST_OP_AND || st_arg2_op == TEST_OP_OR) { + if (st_op != st_arg2_op && !st_arg2->inside_brackets) { + g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'")); + break; + } + } + + break; + } + semcheck(st_arg1, deprecated); + semcheck(st_arg2, deprecated); break; case TEST_OP_EQ: @@ -1281,7 +1306,7 @@ check_test(stnode_t *st_node) /* Check the entire syntax tree. */ static void -semcheck(stnode_t *st_node) +semcheck(stnode_t *st_node, GPtrArray *deprecated) { #ifdef DEBUG_dfilter static guint i = 0; @@ -1291,7 +1316,7 @@ semcheck(stnode_t *st_node) * node will be a TEST node, no matter what. So assert that. */ switch (stnode_type_id(st_node)) { case STTYPE_TEST: - check_test(st_node); + check_test(st_node, deprecated); break; default: g_assert_not_reached(); @@ -1303,7 +1328,7 @@ semcheck(stnode_t *st_node) * some of the nodes into the form they need to be in order to * later generate the DFVM bytecode. */ gboolean -dfw_semcheck(dfwork_t *dfw) +dfw_semcheck(dfwork_t *dfw, GPtrArray *deprecated) { volatile gboolean ok_filter = TRUE; #ifdef DEBUG_dfilter @@ -1315,7 +1340,7 @@ dfw_semcheck(dfwork_t *dfw) * the semantic-checking, the semantic-checking code will * throw an exception if a problem is found. */ TRY { - semcheck(dfw->st_root); + semcheck(dfw->st_root, deprecated); } CATCH(TypeError) { ok_filter = FALSE; diff --git a/epan/dfilter/semcheck.h b/epan/dfilter/semcheck.h index e3076ae..36cfe3f 100644 --- a/epan/dfilter/semcheck.h +++ b/epan/dfilter/semcheck.h @@ -25,7 +25,7 @@ #define SEMCHECK_H gboolean -dfw_semcheck(dfwork_t *dfw); +dfw_semcheck(dfwork_t *dfw, GPtrArray *deprecated); #endif diff --git a/epan/dfilter/syntax-tree.c b/epan/dfilter/syntax-tree.c index 1431814..abede8f 100644 --- a/epan/dfilter/syntax-tree.c +++ b/epan/dfilter/syntax-tree.c @@ -91,6 +91,7 @@ stnode_new(sttype_id_t type_id, gpointer data) node = g_new(stnode_t, 1); node->magic = STNODE_MAGIC; node->deprecated_token = NULL; + node->inside_brackets = FALSE; if (type_id == STTYPE_UNINITIALIZED) { node->type = NULL; @@ -112,6 +113,12 @@ stnode_new(sttype_id_t type_id, gpointer data) return node; } +void +stnode_set_bracket(stnode_t *node, gboolean bracket) +{ + node->inside_brackets = bracket; +} + stnode_t* stnode_dup(const stnode_t *org) { @@ -132,6 +139,7 @@ stnode_dup(const stnode_t *org) else node->data = org->data; node->value = org->value; + node->inside_brackets = org->inside_brackets; return node; } diff --git a/epan/dfilter/syntax-tree.h b/epan/dfilter/syntax-tree.h index 6bf80fc..2a53538 100644 --- a/epan/dfilter/syntax-tree.h +++ b/epan/dfilter/syntax-tree.h @@ -65,6 +65,7 @@ typedef struct { * set aside to time to do so. */ gpointer data; gint32 value; + gboolean inside_brackets; const char *deprecated_token; } stnode_t; @@ -88,6 +89,9 @@ sttype_register(sttype_t *type); stnode_t* stnode_new(sttype_id_t type_id, gpointer data); +void +stnode_set_bracket(stnode_t *node, gboolean bracket); + stnode_t* stnode_dup(const stnode_t *org);
- References:
- [Wireshark-dev] Display filter and/or precedence
- From: Gerald Combs
- Re: [Wireshark-dev] Display filter and/or precedence
- From: Evan Huus
- Re: [Wireshark-dev] Display filter and/or precedence
- From: Guy Harris
- Re: [Wireshark-dev] Display filter and/or precedence
- From: Jakub Zawadzki
- [Wireshark-dev] Display filter and/or precedence
- Prev by Date: Re: [Wireshark-dev] Display filter and/or precedence
- Next by Date: [Wireshark-dev] Domain Name Resolution
- Previous by thread: Re: [Wireshark-dev] Display filter and/or precedence
- Next by thread: Re: [Wireshark-dev] Display filter and/or precedence
- Index(es):