]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
dfa: don't clear states, just mark dfa dead
authorJustin Viiret <justin.viiret@intel.com>
Fri, 23 Jun 2017 03:01:47 +0000 (13:01 +1000)
committerMatthew Barr <matthew.barr@intel.com>
Mon, 21 Aug 2017 01:10:11 +0000 (11:10 +1000)
The previous change caused some assertion issues.

src/nfa/dfa_min.cpp
src/nfa/mcclellancompile.cpp
src/nfa/mcclellancompile_util.cpp
src/nfa/mcclellancompile_util.h

index f309cc535f1400043d2b2d47e9ef472569072da9..c97ca5fb989dc5ce3f4769af7ececc5520def494 100644 (file)
@@ -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);
index e875477b18e27f420bd68ba4af606bf5b83973fa..43b555afc74661529486863307fbf2ca7e9c7dd9 100644 (file)
@@ -964,6 +964,8 @@ bytecode_ptr<NFA> mcclellanCompile_i(raw_dfa &raw, accel_dfa_build_strat &strat,
                                      const CompileContext &cc,
                                      bool trust_daddy_states,
                                      set<dstate_id_t> *accel_states) {
+    assert(!is_dead(raw));
+
     u16 total_daddy = 0;
     dfa_info info(strat);
     bool using8bit = cc.grey.allowMcClellan8 && info.size() <= 256;
index 8bb258d381406a3ed0c228476b89204b67ef8d5f..317c588948940434afc3fa2a8126a67b6a0133ba 100644 (file)
@@ -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
index d681e06b14191300ac8a567e8547ddb6d2fe511b..bc730cddeab6d6bdd95a84d59119512eedcad5de 100644 (file)
@@ -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