mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-09-29 19:24:25 +03:00
ng: ensure that only match states have reports
Ensure (and assert) that vertices without an edge to {accept, acceptEod} do not have reports set.
This commit is contained in:
committed by
Matthew Barr
parent
3d9a60d023
commit
4ce268af47
@@ -105,6 +105,7 @@ bool addComponentSom(NG &ng, NGHolder &g, const NGWrapper &w,
|
||||
DEBUG_PRINTF("doing som\n");
|
||||
dumpComponent(g, "03_presom", w.expressionIndex, comp_id, ng.cc.grey);
|
||||
assert(hasCorrectlyNumberedVertices(g));
|
||||
assert(allMatchStatesHaveReports(w));
|
||||
|
||||
// First, we try the "SOM chain" support in ng_som.cpp.
|
||||
|
||||
@@ -208,6 +209,8 @@ bool addComponent(NG &ng, NGHolder &g, const NGWrapper &w, const som_type som,
|
||||
|
||||
dumpComponent(g, "01_begin", w.expressionIndex, comp_id, ng.cc.grey);
|
||||
|
||||
assert(allMatchStatesHaveReports(w));
|
||||
|
||||
reduceGraph(g, som, w.utf8, cc);
|
||||
|
||||
dumpComponent(g, "02_reduced", w.expressionIndex, comp_id, ng.cc.grey);
|
||||
@@ -232,6 +235,8 @@ bool addComponent(NG &ng, NGHolder &g, const NGWrapper &w, const som_type som,
|
||||
}
|
||||
}
|
||||
|
||||
assert(allMatchStatesHaveReports(w));
|
||||
|
||||
if (splitOffAnchoredAcyclic(*ng.rose, g, cc)) {
|
||||
return true;
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Intel Corporation
|
||||
* Copyright (c) 2015-2016, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -553,6 +553,7 @@ void ensureCodePointStart(ReportManager &rm, NGWrapper &g) {
|
||||
add_edge(g.startDs, v_4, g);
|
||||
remove_edge(orig, g);
|
||||
g.renumberEdges();
|
||||
clearReports(g);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -363,6 +363,12 @@ void splitIntoComponents(const NGHolder &g, deque<unique_ptr<NGHolder>> &comps,
|
||||
*shell_comp = true;
|
||||
}
|
||||
|
||||
// Ensure that only vertices with accept edges have reports.
|
||||
for (auto &gc : comps) {
|
||||
assert(gc);
|
||||
clearReports(*gc);
|
||||
}
|
||||
|
||||
// We should never produce empty component graphs.
|
||||
assert(all_of(begin(comps), end(comps),
|
||||
[](const unique_ptr<NGHolder> &g_comp) {
|
||||
|
@@ -79,13 +79,17 @@ bool sanityCheckGraph(const NGHolder &g,
|
||||
}
|
||||
}
|
||||
|
||||
// Vertices with edges to accept or acceptEod must have reports.
|
||||
// Vertices with edges to accept or acceptEod must have reports and
|
||||
// other vertices must not have them.
|
||||
if (is_match_vertex(v, g) && v != g.accept) {
|
||||
if (g[v].reports.empty()) {
|
||||
DEBUG_PRINTF("vertex %u has no reports\n",
|
||||
g[v].index);
|
||||
DEBUG_PRINTF("vertex %u has no reports\n", g[v].index);
|
||||
return false;
|
||||
}
|
||||
} else if (!g[v].reports.empty()) {
|
||||
DEBUG_PRINTF("vertex %u has reports but no accept edge\n",
|
||||
g[v].index);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Participant vertices should have distinct state indices.
|
||||
|
@@ -872,6 +872,7 @@ u32 removeTrailingLiteralStates(NGHolder &g, const ue2_literal &lit,
|
||||
}
|
||||
|
||||
clear_in_edges(g.accept, g);
|
||||
clearReports(g);
|
||||
|
||||
vector<NFAVertex> verts(pred.begin(), pred.end());
|
||||
sort(verts.begin(), verts.end(), VertexIndexOrdering<NGHolder>(g));
|
||||
|
@@ -631,16 +631,18 @@ unique_ptr<NGHolder> cloneHolder(const NGHolder &in) {
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
/** \brief Used in sanity-checking assertions: returns true if all vertices
|
||||
* leading to accept or acceptEod have at least one report ID. */
|
||||
|
||||
bool allMatchStatesHaveReports(const NGHolder &g) {
|
||||
unordered_set<NFAVertex> reporters;
|
||||
for (auto v : inv_adjacent_vertices_range(g.accept, g)) {
|
||||
if (g[v].reports.empty()) {
|
||||
DEBUG_PRINTF("vertex %u has no reports!\n",
|
||||
g[v].index);
|
||||
return false;
|
||||
}
|
||||
reporters.insert(v);
|
||||
}
|
||||
|
||||
for (auto v : inv_adjacent_vertices_range(g.acceptEod, g)) {
|
||||
if (v == g.accept) {
|
||||
continue; // stylised edge
|
||||
@@ -650,12 +652,20 @@ bool allMatchStatesHaveReports(const NGHolder &g) {
|
||||
g[v].index);
|
||||
return false;
|
||||
}
|
||||
reporters.insert(v);
|
||||
}
|
||||
|
||||
for (auto v : vertices_range(g)) {
|
||||
if (!contains(reporters, v) && !g[v].reports.empty()) {
|
||||
DEBUG_PRINTF("vertex %u is not a match state, but has reports!\n",
|
||||
g[v].index);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Assertion: returns true if the vertices in this graph are contiguously (and
|
||||
* uniquely) numbered from zero. */
|
||||
bool hasCorrectlyNumberedVertices(const NGHolder &g) {
|
||||
size_t count = num_vertices(g);
|
||||
vector<bool> ids(count, false);
|
||||
@@ -670,8 +680,6 @@ bool hasCorrectlyNumberedVertices(const NGHolder &g) {
|
||||
&& num_vertices(g) == num_vertices(g.g);
|
||||
}
|
||||
|
||||
/** Assertion: returns true if the edges in this graph are contiguously (and
|
||||
* uniquely) numbered from zero. */
|
||||
bool hasCorrectlyNumberedEdges(const NGHolder &g) {
|
||||
size_t count = num_edges(g);
|
||||
vector<bool> ids(count, false);
|
||||
|
@@ -297,15 +297,29 @@ void clearReports(NGHolder &g);
|
||||
void duplicateReport(NGHolder &g, ReportID r_old, ReportID r_new);
|
||||
|
||||
#ifndef NDEBUG
|
||||
// Assertions: only available in internal builds
|
||||
|
||||
/** \brief Used in sanity-checking assertions: returns true if all vertices
|
||||
* leading to accept or acceptEod have at least one report ID. */
|
||||
// Assertions: only available in internal builds.
|
||||
|
||||
/**
|
||||
* Used in sanity-checking assertions: returns true if all vertices
|
||||
* with edges to accept or acceptEod have at least one report ID. Additionally,
|
||||
* checks that ONLY vertices with edges to accept or acceptEod has reports.
|
||||
*/
|
||||
bool allMatchStatesHaveReports(const NGHolder &g);
|
||||
|
||||
/**
|
||||
* Assertion: returns true if the vertices in this graph are contiguously (and
|
||||
* uniquely) numbered from zero.
|
||||
*/
|
||||
bool hasCorrectlyNumberedVertices(const NGHolder &g);
|
||||
|
||||
/**
|
||||
* Assertion: returns true if the edges in this graph are contiguously (and
|
||||
* uniquely) numbered from zero.
|
||||
*/
|
||||
bool hasCorrectlyNumberedEdges(const NGHolder &g);
|
||||
#endif
|
||||
|
||||
#endif // NDEBUG
|
||||
|
||||
} // namespace ue2
|
||||
|
||||
|
Reference in New Issue
Block a user