diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-26 00:17:31 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-26 00:17:31 +0330 |
commit | 7bd975ec69c8dc9d5a6343a2e5f06bd7dd78d78e (patch) | |
tree | 9fe870b610bea06b491963dad553d81b68d5760e | |
parent | 20fea9f540b996bf0efa8ecaf390f12a3c7254c3 (diff) |
fix null double free
-rw-r--r-- | code/main.felan | 15 | ||||
-rw-r--r-- | src/compiler/ast-tree.c | 21 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 2 | ||||
-rw-r--r-- | src/compiler/parser.c | 2 | ||||
-rw-r--r-- | src/runner/runner.c | 3 |
5 files changed, 18 insertions, 25 deletions
diff --git a/code/main.felan b/code/main.felan index f1db641..26a330c 100644 --- a/code/main.felan +++ b/code/main.felan @@ -1,16 +1,3 @@ main :: () -> void { - print_u64 fibo(10); -}; - -f :: (a:u64,b:u64)->u64{ - return b-a; -}; - -fibo :: (a:u64)->u64{ - if a == 0 - return 1; - else if a == 1 - return 1; - else - return fibo(a-1)+fibo(a-2); + b : *u64 = null; }; diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 1bfda8c..5a6961a 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -579,9 +579,8 @@ void astTreeDelete(AstTree *tree) { } bool astTreeShouldDelete(AstTree *tree) { - return (AST_TREE_TOKEN_STATIC_VARS_BEGIN > tree->token || - tree->token > AST_TREE_TOKEN_STATIC_VARS_END) && - tree != &AST_TREE_VOID_VALUE; + return AST_TREE_TOKEN_STATIC_VARS_BEGIN > tree->token || + tree->token > AST_TREE_TOKEN_STATIC_VARS_END; } void astTreeRootDelete(AstTreeRoot *root) { @@ -620,9 +619,11 @@ AstTree *copyAstTree(AstTree *tree) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: - case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_VALUE_VOID: return tree; + case AST_TREE_TOKEN_VALUE_NULL: + return newAstTree(tree->token, NULL, copyAstTree(tree->type), tree->str_begin, + tree->str_end); case AST_TREE_TOKEN_VALUE_INT: case AST_TREE_TOKEN_VALUE_BOOL: return newAstTree(tree->token, tree->metadata, tree->type, tree->str_begin, @@ -2089,6 +2090,7 @@ AstTree *makeTypeOf(AstTree *value) { case AST_TREE_TOKEN_KEYWORD_IF: case AST_TREE_TOKEN_KEYWORD_WHILE: case AST_TREE_TOKEN_SCOPE: + case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_NONE: } UNREACHABLE; @@ -2478,7 +2480,7 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL: return setTypesOperatorInfixWithRet(tree, &AST_TREE_BOOL_TYPE, helper); case AST_TREE_TOKEN_OPERATOR_POINTER: - return setTypesOperatorIndirection(tree, helper); + return setTypesOperatorPointer(tree, helper); case AST_TREE_TOKEN_VARIABLE_DEFINE: return setTypesVariableDefine(tree, helper); case AST_TREE_TOKEN_KEYWORD_IF: @@ -2643,10 +2645,11 @@ bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) { bool setTypesValueNull(AstTree *tree, AstTreeSetTypesHelper helper) { if (helper.lookingType == NULL) { + printError(tree->str_begin, tree->str_end, "Can't find type of null"); return false; } - tree->type = getValue(helper.lookingType, helper); - return tree->type != NULL; + tree->type = copyAstTree(helper.lookingType); + return true; } bool setTypesFunction(AstTree *tree, AstTreeSetTypesHelper helper) { @@ -2898,11 +2901,13 @@ bool setTypesOperatorUnary(AstTree *tree, AstTreeSetTypesHelper helper) { } } -bool setTypesOperatorIndirection(AstTree *tree, AstTreeSetTypesHelper helper) { +bool setTypesOperatorPointer(AstTree *tree, AstTreeSetTypesHelper helper) { AstTreeSingleChild *metadata = tree->metadata; if (!setAllTypes(metadata, helper, NULL)) { return false; } else if (!typeIsEqual(metadata->type, &AST_TREE_TYPE_TYPE)) { + printError(tree->str_begin, tree->str_end, "Pointer type needs a type"); + return false; UNREACHABLE; } diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index dd845a2..33cf9da 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -257,7 +257,7 @@ bool setTypesOperatorInfix(AstTree *tree, AstTreeSetTypesHelper helper); bool setTypesOperatorInfixWithRet(AstTree *tree, AstTree *retType, AstTreeSetTypesHelper helper); bool setTypesOperatorUnary(AstTree *tree, AstTreeSetTypesHelper helper); -bool setTypesOperatorIndirection(AstTree *tree, AstTreeSetTypesHelper helper); +bool setTypesOperatorPointer(AstTree *tree, AstTreeSetTypesHelper helper); bool setTypesVariableDefine(AstTree *tree, AstTreeSetTypesHelper helper); bool setTypesIf(AstTree *tree, AstTreeSetTypesHelper helper, AstTreeFunction *function); diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 327fab2..3c40af1 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -1617,6 +1617,7 @@ bool isType(ParserNode *node) { case PARSER_TOKEN_KEYWORD_IF: case PARSER_TOKEN_KEYWORD_COMPTIME: case PARSER_TOKEN_OPERATOR_POINTER: + case PARSER_TOKEN_SYMBOL_CURLY_BRACKET: return true; case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_CONSTANT: @@ -1624,7 +1625,6 @@ bool isType(ParserNode *node) { case PARSER_TOKEN_FUNCTION_DEFINITION: case PARSER_TOKEN_ROOT: case PARSER_TOKEN_SYMBOL_EOL: - case PARSER_TOKEN_SYMBOL_CURLY_BRACKET: case PARSER_TOKEN_SYMBOL_COMMA: case PARSER_TOKEN_VALUE_INT: case PARSER_TOKEN_VALUE_FLOAT: diff --git a/src/runner/runner.c b/src/runner/runner.c index 28270ea..f120816 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -328,7 +328,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_VARIABLE_DEFINE: { AstTreeVariable *variable = expr->metadata; - runnerVariableSetValue(pages, variable, copyAstTree(variable->value)); + runnerVariableSetValue(pages, variable, + runExpression(variable->value, pages, shouldRet)); return &AST_TREE_VOID_VALUE; } case AST_TREE_TOKEN_KEYWORD_IF: { |