From 75e4aefabec32a85596dcebc67287c231f3ec23d Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Fri, 23 Jun 2017 13:01:47 +1000 Subject: [PATCH] dfa: don't clear states, just mark dfa dead The previous change caused some assertion issues. --- src/nfa/dfa_min.cpp | 5 +++++ src/nfa/mcclellancompile.cpp | 2 ++ src/nfa/mcclellancompile_util.cpp | 6 +++++- src/nfa/mcclellancompile_util.h | 7 +++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/nfa/dfa_min.cpp b/src/nfa/dfa_min.cpp index f309cc53..c97ca5fb 100644 --- a/src/nfa/dfa_min.cpp +++ b/src/nfa/dfa_min.cpp @@ -59,6 +59,7 @@ #include "dfa_min.h" #include "grey.h" +#include "mcclellancompile_util.h" #include "rdfa.h" #include "ue2common.h" #include "util/container.h" @@ -299,6 +300,10 @@ void minimize_hopcroft(raw_dfa &rdfa, const Grey &grey) { return; } + if (is_dead(rdfa)) { + DEBUG_PRINTF("dfa is empty\n"); + } + UNUSED const size_t states_before = rdfa.states.size(); HopcroftInfo info(rdfa); diff --git a/src/nfa/mcclellancompile.cpp b/src/nfa/mcclellancompile.cpp index e875477b..43b555af 100644 --- a/src/nfa/mcclellancompile.cpp +++ b/src/nfa/mcclellancompile.cpp @@ -964,6 +964,8 @@ bytecode_ptr mcclellanCompile_i(raw_dfa &raw, accel_dfa_build_strat &strat, const CompileContext &cc, bool trust_daddy_states, set *accel_states) { + assert(!is_dead(raw)); + u16 total_daddy = 0; dfa_info info(strat); bool using8bit = cc.grey.allowMcClellan8 && info.size() <= 256; diff --git a/src/nfa/mcclellancompile_util.cpp b/src/nfa/mcclellancompile_util.cpp index 8bb258d3..317c5889 100644 --- a/src/nfa/mcclellancompile_util.cpp +++ b/src/nfa/mcclellancompile_util.cpp @@ -197,7 +197,6 @@ bool clear_deeper_reports(raw_dfa &raw, u32 max_offset) { return ds.reports.empty() && ds.reports_eod.empty(); })) { DEBUG_PRINTF("no reports left at all, dfa is dead\n"); - raw.states.clear(); raw.start_anchored = DEAD_STATE; raw.start_floating = DEAD_STATE; } @@ -287,4 +286,9 @@ bool can_die_early(const raw_dfa &raw, u32 age_limit) { return can_die_early(raw, raw.start_anchored, visited, age_limit); } +bool is_dead(const raw_dfa &rdfa) { + return rdfa.start_anchored == DEAD_STATE && + rdfa.start_floating == DEAD_STATE; +} + } // namespace ue2 diff --git a/src/nfa/mcclellancompile_util.h b/src/nfa/mcclellancompile_util.h index d681e06b..bc730cdd 100644 --- a/src/nfa/mcclellancompile_util.h +++ b/src/nfa/mcclellancompile_util.h @@ -59,6 +59,13 @@ size_t hash_dfa(const raw_dfa &rdfa); bool can_die_early(const raw_dfa &raw, u32 age_limit); +/** + * \brief Returns true if this DFA cannot match, i.e. its start state is + * DEAD_STATE. + */ +bool is_dead(const raw_dfa &rdfa); + + } // namespace ue2 #endif