Mercurial > lbo > hg > ylisp
changeset 68:d7a3916c0e17
parse: Test parser failure
Fix another memory leak
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 25 Aug 2019 15:47:05 +0200 |
parents | b2401225b53f |
children | bc9b86683bc3 |
files | gen/y.yy src/parse.c src/parse_test.c |
diffstat | 3 files changed, 19 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/y.yy Sun Aug 25 14:26:17 2019 +0200 +++ b/gen/y.yy Sun Aug 25 15:47:05 2019 +0200 @@ -129,7 +129,6 @@ | %empty { ydbg_print("finished quoted sexpr\n"); yexpr_t e = yexpr_new(); - yexpr_init(&e); yvec_t v; YVEC_INIT(&v, 0, yexpr_t); yexpr_set_list(&e, v); @@ -147,7 +146,6 @@ | %empty { ydbg_print("finished sexpr\n"); yexpr_t e = yexpr_new(); - yexpr_init(&e); yvec_t v; YVEC_INIT(&v, 0, yexpr_t); yexpr_set_list(&e, v);
--- a/src/parse.c Sun Aug 25 14:26:17 2019 +0200 +++ b/src/parse.c Sun Aug 25 15:47:05 2019 +0200 @@ -9,6 +9,7 @@ int ret = y_bison_parse(input, &exprs, error); if (ret > 0) { + yvec_destroy(&exprs); return false; }
--- a/src/parse_test.c Sun Aug 25 14:26:17 2019 +0200 +++ b/src/parse_test.c Sun Aug 25 15:47:05 2019 +0200 @@ -21,9 +21,27 @@ ystr_destroy(&error); yexpr_destroy(&result); + fclose(input_f); +} + +void test_parse_fail(void) { + const char* invalid_input = "(hello 'world"; + FILE* input_f = fmemopen((char*)invalid_input, strlen(invalid_input), + "r"); // const-cast is ok, we only read + yexpr_t result = yexpr_new(); + ystr_t error = ystr_new(NULL); + bool ret = yparse(input_f, &result, &error); + assert(!ret); + assert(0 < ystr_len(&error)); + assert(YEXPR_UNDEF == result.typ); + + ystr_destroy(&error); + yexpr_destroy(&result); + fclose(input_f); } int main(int argc, char** argv) { test_simple_parse(); + test_parse_fail(); return 0; }