add a missing end-of-input check in the LL(k) backend

This commit is contained in:
Sven M. Hallberg 2015-08-25 14:14:48 +02:00
parent 25b27490c3
commit c5f2c5aa2b
2 changed files with 26 additions and 0 deletions

View file

@ -349,6 +349,8 @@ HParseResult *h_llk_parse(HAllocator* mm__, const HParser* parser, HInputStream*
break; break;
case HCF_CHAR: case HCF_CHAR:
if(stream->overrun)
goto no_parse;
if(input != x->chr) if(input != x->chr)
goto no_parse; goto no_parse;
tok->token_type = TT_UINT; tok->token_type = TT_UINT;

View file

@ -95,8 +95,32 @@ static void test_read_bits_48(void) {
} }
} }
static void test_llk_zero_end(void) {
HParserBackend be = PB_LLk;
HParser *z = h_ch('\x00');
HParser *az = h_sequence(h_ch('a'), z, NULL);
HParser *ze = h_sequence(z, h_end_p(), NULL);
HParser *aze = h_sequence(h_ch('a'), z, h_end_p(), NULL);
// some cases surrounding the bug
g_check_parse_match (z, be, "\x00", 1, "u0");
g_check_parse_failed(z, be, "", 0);
g_check_parse_match (ze, be, "\x00", 1, "(u0)");
g_check_parse_failed(ze, be, "\x00b", 2);
g_check_parse_failed(ze, be, "", 0);
g_check_parse_match (az, be, "a\x00", 2, "(u0x61 u0)");
g_check_parse_match (aze, be, "a\x00", 2, "(u0x61 u0)");
g_check_parse_failed(aze, be, "a\x00b", 3);
// the following should not parse but did when the LL(k) backend failed to
// check for the end of input, mistaking it for a zero character.
g_check_parse_failed(az, be, "a", 1);
g_check_parse_failed(aze, be, "a", 1);
}
void register_regression_tests(void) { void register_regression_tests(void) {
g_test_add_func("/core/regression/bug118", test_bug118); g_test_add_func("/core/regression/bug118", test_bug118);
g_test_add_func("/core/regression/seq_index_path", test_seq_index_path); g_test_add_func("/core/regression/seq_index_path", test_seq_index_path);
g_test_add_func("/core/regression/read_bits_48", test_read_bits_48); g_test_add_func("/core/regression/read_bits_48", test_read_bits_48);
g_test_add_func("/core/regression/llk_zero_end", test_llk_zero_end);
} }