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;
 }