Pārlūkot izejas kodu

Added some sanity checks to ask and parser (reported by static analyzer).

Marco Bambini 8 gadi atpakaļ
vecāks
revīzija
da2a2911b7
2 mainītis faili ar 7 papildinājumiem un 4 dzēšanām
  1. 5 3
      src/compiler/gravity_ast.c
  2. 2 1
      src/compiler/gravity_parser.c

+ 5 - 3
src/compiler/gravity_ast.c

@@ -38,6 +38,8 @@ gnode_r *gnode_array_create (void) {
 }
 
 void gnode_array_sethead(gnode_r *list, gnode_t *node) {
+    if (!list || !node) return;
+    
 	// get old size
 	size_t list_size = gnode_array_size(list);
 	
@@ -498,7 +500,7 @@ void *meta_from_node (gnode_t *node) {
 static void free_list_stmt (gvisitor_t *self, gnode_compound_stmt_t *node) {
 	CHECK_REFCOUNT(node);
 	gnode_array_each(node->stmts, {visit(val);});
-	gnode_array_free(node->stmts);
+	if (node->stmts) gnode_array_free(node->stmts);
 	
 	if (node->symtable) symboltable_free(node->symtable);
 	mem_free((gnode_t*)node);
@@ -507,7 +509,7 @@ static void free_list_stmt (gvisitor_t *self, gnode_compound_stmt_t *node) {
 static void free_compound_stmt (gvisitor_t *self, gnode_compound_stmt_t *node) {
 	CHECK_REFCOUNT(node);
 	gnode_array_each(node->stmts, {visit(val);});
-	gnode_array_free(node->stmts);
+	if (node->stmts) gnode_array_free(node->stmts);
 	
 	if (node->symtable) symboltable_free(node->symtable);
 	mem_free((gnode_t*)node);
@@ -668,7 +670,7 @@ static void free_file_expr (gvisitor_t *self, gnode_file_expr_t *node) {
 		mem_free((void *)val);
 	});
 	
-	gnode_array_free(node->identifiers);
+	if (node->identifiers) gnode_array_free(node->identifiers);
 	mem_free((void *)node);
 }
 

+ 2 - 1
src/compiler/gravity_parser.c

@@ -124,6 +124,7 @@ static gnode_t *get_enclosing (gravity_parser_t *parser, gnode_n tag) {
     --n;
     while (n >= 0) {
         gnode_t *decl = gnode_array_get(parser->declarations, n);
+        if (!decl) return NULL;
         if (decl->tag == tag) return decl;
         --n;
     }
@@ -2558,7 +2559,7 @@ void gravity_parser_free (gravity_parser_t *parser) {
 		mem_free(parser->lexer);
 	}
 	
-	marray_destroy(*parser->declarations);
+	if (parser->declarations) marray_destroy(*parser->declarations);
 	// parser->statements is returned from gravity_parser_run
 	// and must be deallocated using gnode_free