/* Check the syntax tree for semantic errors, and convert * 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) { volatile gboolean ok_filter = TRUE; #ifdef DEBUG_dfilter static guint i = 0; #endif DebugLog(("1 dfw_semcheck(dfwork_t *dfw = %p) [%u]\n", dfw, i)); /* Instead of having to check for errors at every stage of * the semantic-checking, the semantic-checking code will * throw an exception if a problem is found. */ TRY { semcheck(dfw->st_root); } CATCH(TypeError) { ok_filter = FALSE; } ENDTRY; DebugLog(("1 dfw_semcheck(dfwork_t *dfw = %p) [%u] - Returns %d\n", dfw, i++,ok_filter)); return ok_filter; }
/* Check the semantics of any type of TEST */ static void check_test(stnode_t *st_node) { test_op_t st_op; stnode_t *st_arg1, *st_arg2; #ifdef DEBUG_dfilter static guint i = 0; #endif DebugLog((" 3 check_test(stnode_t *st_node = %p) [%u]\n", st_node, i)); sttype_test_get(st_node, &st_op, &st_arg1, &st_arg2); switch (st_op) { case TEST_OP_UNINITIALIZED: g_assert_not_reached(); break; case TEST_OP_EXISTS: check_exists(st_arg1); break; case TEST_OP_NOT: semcheck(st_arg1); break; case TEST_OP_AND: case TEST_OP_OR: semcheck(st_arg1); semcheck(st_arg2); break; case TEST_OP_EQ: check_relation("==", FALSE, ftype_can_eq, st_node, st_arg1, st_arg2); break; case TEST_OP_NE: check_relation("!=", FALSE, ftype_can_ne, st_node, st_arg1, st_arg2); break; case TEST_OP_GT: check_relation(">", FALSE, ftype_can_gt, st_node, st_arg1, st_arg2); break; case TEST_OP_GE: check_relation(">=", FALSE, ftype_can_ge, st_node, st_arg1, st_arg2); break; case TEST_OP_LT: check_relation("<", FALSE, ftype_can_lt, st_node, st_arg1, st_arg2); break; case TEST_OP_LE: check_relation("<=", FALSE, ftype_can_le, st_node, st_arg1, st_arg2); break; case TEST_OP_BITWISE_AND: check_relation("&", FALSE, ftype_can_bitwise_and, st_node, st_arg1, st_arg2); break; case TEST_OP_CONTAINS: check_relation("contains", TRUE, ftype_can_contains, st_node, st_arg1, st_arg2); break; case TEST_OP_MATCHES: #ifdef HAVE_LIBPCRE check_relation("matches", TRUE, ftype_can_matches, st_node, st_arg1, st_arg2); #else dfilter_fail("This Wireshark version does not support the \"matches\" operation."); THROW(TypeError); #endif break; default: g_assert_not_reached(); } DebugLog((" 3 check_test(stnode_t *st_node = %p) [%u] - End\n", st_node, i++)); }
/* Check the semantics of any type of TEST */ static void check_test(stnode_t *st_node, GPtrArray *deprecated) { test_op_t st_op, st_arg_op; stnode_t *st_arg1, *st_arg2; #ifdef DEBUG_dfilter static guint i = 0; #endif DebugLog((" 3 check_test(stnode_t *st_node = %p) [%u]\n", st_node, i)); sttype_test_get(st_node, &st_op, &st_arg1, &st_arg2); switch (st_op) { case TEST_OP_UNINITIALIZED: g_assert_not_reached(); break; case TEST_OP_EXISTS: check_exists(st_arg1); break; case TEST_OP_NOT: semcheck(st_arg1, deprecated); break; case TEST_OP_AND: case TEST_OP_OR: if (stnode_type_id(st_arg1) == STTYPE_TEST) { sttype_test_get(st_arg1, &st_arg_op, NULL, NULL); if (st_arg_op == TEST_OP_AND || st_arg_op == TEST_OP_OR) { if (st_op != st_arg_op && !st_arg1->inside_brackets) g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'")); } } if (stnode_type_id(st_arg2) == STTYPE_TEST) { sttype_test_get(st_arg2, &st_arg_op, NULL, NULL); if (st_arg_op == TEST_OP_AND || st_arg_op == TEST_OP_OR) { if (st_op != st_arg_op && !st_arg2->inside_brackets) g_ptr_array_add(deprecated, g_strdup("suggest parentheses around '&&' within '||'")); } } semcheck(st_arg1, deprecated); semcheck(st_arg2, deprecated); break; case TEST_OP_EQ: check_relation("==", FALSE, ftype_can_eq, st_node, st_arg1, st_arg2); break; case TEST_OP_NE: check_relation("!=", FALSE, ftype_can_ne, st_node, st_arg1, st_arg2); break; case TEST_OP_GT: check_relation(">", FALSE, ftype_can_gt, st_node, st_arg1, st_arg2); break; case TEST_OP_GE: check_relation(">=", FALSE, ftype_can_ge, st_node, st_arg1, st_arg2); break; case TEST_OP_LT: check_relation("<", FALSE, ftype_can_lt, st_node, st_arg1, st_arg2); break; case TEST_OP_LE: check_relation("<=", FALSE, ftype_can_le, st_node, st_arg1, st_arg2); break; case TEST_OP_BITWISE_AND: check_relation("&", FALSE, ftype_can_bitwise_and, st_node, st_arg1, st_arg2); break; case TEST_OP_CONTAINS: check_relation("contains", TRUE, ftype_can_contains, st_node, st_arg1, st_arg2); break; case TEST_OP_MATCHES: check_relation("matches", TRUE, ftype_can_matches, st_node, st_arg1, st_arg2); break; default: g_assert_not_reached(); } DebugLog((" 3 check_test(stnode_t *st_node = %p) [%u] - End\n", st_node, i++)); }