summaryrefslogtreecommitdiff
path: root/src/compiler/ast-tree.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-26 00:17:31 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-26 00:17:31 +0330
commit7bd975ec69c8dc9d5a6343a2e5f06bd7dd78d78e (patch)
tree9fe870b610bea06b491963dad553d81b68d5760e /src/compiler/ast-tree.c
parent20fea9f540b996bf0efa8ecaf390f12a3c7254c3 (diff)
fix null double free
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r--src/compiler/ast-tree.c21
1 files changed, 13 insertions, 8 deletions
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;
}