cex: fix crash from zombie result

Fixes the SEGV in test 247 (counterexample.at:195): "S/R after first
token".

* src/counterexample.c: here.
* tests/counterexample.at: Fix expectations.
This commit is contained in:
Vincent Imbimbo
2020-05-16 11:32:29 -04:00
committed by Akim Demaille
parent 93c849ef0d
commit 66283fb625
2 changed files with 16 additions and 6 deletions

View File

@@ -559,6 +559,13 @@ search_state_free (search_state *ss)
free (ss);
}
static inline void
search_state_retain_derivs (search_state *ss)
{
parse_state_retain_deriv (ss->states[0]);
parse_state_retain_deriv (ss->states[1]);
}
static void
search_state_print (search_state *ss)
{
@@ -1057,12 +1064,11 @@ unifying_example (state_item_number itm1,
// we've found a unifying counterexample.
cex = new_counterexample (d1, d2, true, false);
// prevent d1/d2 from being freed.
parse_state_retain_deriv (ps1);
parse_state_retain_deriv (ps2);
search_state_retain_derivs (ss);
goto cex_search_end;
}
if (!stage3result)
stage3result = ss;
stage3result = copy_search_state (ss);
}
}
if (TIME_LIMIT_ENFORCED)
@@ -1094,7 +1100,11 @@ cex_search_end:;
// If a search state from Stage 3 is available, use it
// to construct a more compact nonunifying counterexample.
if (stage3result)
cex = complete_diverging_examples (stage3result, next_sym);
{
cex = complete_diverging_examples (stage3result, next_sym);
search_state_retain_derivs (stage3result);
search_state_free (stage3result);
}
// Otherwise, construct a nonunifying counterexample that
// begins from the start state using the shortest
// lookahead-sensitive path to the reduce item.

View File

@@ -222,8 +222,8 @@ Shift-Reduce Conflict:
10: 8 x: X .
10: 9 xx: X . X
On Symbol: X
First Example X • X
First derivation t ::=[ x ::=[ X • ] X ]
First Example X • X xy
First derivation a ::=[ x ::=[ X • ] t ::=[ X xy ] ]
Second Example A X • X
Second derivation a ::=[ t ::=[ A xx ::=[ X • X ] ] ]