X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ast.c;h=919e0a636e9befadfc3b4400bb56d09853ef831c;hp=c68ba9f065eecca940f1ef92c9b46e0989095613;hb=4591b3a4fa86d0c61fa14a66c6da1803f12dd8cf;hpb=b3e87c328009c3c5b1b700d600733906d7792f59 diff --git a/ast.c b/ast.c index c68ba9f..919e0a6 100644 --- a/ast.c +++ b/ast.c @@ -42,7 +42,7 @@ static GMQCC_NORETURN void _ast_node_destroy(ast_node *self) { (void)self; con_err("ast node missing destroy()\n"); - abort(); + exit(EXIT_FAILURE); } /* Initialize main ast node aprts */ @@ -218,7 +218,7 @@ static size_t ast_type_to_string_impl(ast_expression *e, char *buf, size_t bufsi if (!e) { if (pos + 6 >= bufsize) goto full; - strcpy(buf + pos, "(null)"); + strncpy(buf + pos, "(null)", 6); return pos + 6; } @@ -227,7 +227,7 @@ static size_t ast_type_to_string_impl(ast_expression *e, char *buf, size_t bufsi switch (e->expression.vtype) { case TYPE_VARIANT: - strcpy(buf + pos, "(variant)"); + strncpy(buf + pos, "(variant)", 9); return pos + 9; case TYPE_FIELD: @@ -284,7 +284,7 @@ static size_t ast_type_to_string_impl(ast_expression *e, char *buf, size_t bufsi typelen = strlen(typestr); if (pos + typelen >= bufsize) goto full; - strcpy(buf + pos, typestr); + strncpy(buf + pos, typestr, typelen); return pos + typelen; } @@ -1216,7 +1216,7 @@ bool ast_global_codegen(ast_value *self, ir_builder *ir, bool isfield) namelen = strlen(self->name); name = (char*)mem_a(namelen + 16); - strcpy(name, self->name); + strncpy(name, self->name, namelen); array->ir_values = (ir_value**)mem_a(sizeof(array->ir_values[0]) * array->expression.count); array->ir_values[0] = v; @@ -1274,7 +1274,7 @@ bool ast_global_codegen(ast_value *self, ir_builder *ir, bool isfield) namelen = strlen(self->name); name = (char*)mem_a(namelen + 16); - strcpy(name, self->name); + strncpy(name, self->name, namelen); self->ir_values = (ir_value**)mem_a(sizeof(self->ir_values[0]) * self->expression.count); self->ir_values[0] = v; @@ -1407,7 +1407,7 @@ bool ast_local_codegen(ast_value *self, ir_function *func, bool param) v = ir_function_create_local(func, self->name, vtype, param); if (!v) { - compile_error(ast_ctx(self), "ir_function_create_local failed"); + compile_error(ast_ctx(self), "internal error: ir_function_create_local failed"); return false; } v->context = ast_ctx(self); @@ -1416,14 +1416,14 @@ bool ast_local_codegen(ast_value *self, ir_function *func, bool param) namelen = strlen(self->name); name = (char*)mem_a(namelen + 16); - strcpy(name, self->name); + strncpy(name, self->name, namelen); self->ir_values[0] = v; for (ai = 1; ai < self->expression.count; ++ai) { snprintf(name + namelen, 16, "[%u]", (unsigned int)ai); self->ir_values[ai] = ir_function_create_local(func, name, vtype, param); if (!self->ir_values[ai]) { - compile_error(ast_ctx(self), "ir_builder_create_global failed on `%s`", name); + compile_error(ast_ctx(self), "internal_error: ir_builder_create_global failed on `%s`", name); return false; } self->ir_values[ai]->context = ast_ctx(self); @@ -1538,7 +1538,7 @@ bool ast_function_codegen(ast_function *self, ir_builder *ir) irf = self->ir_func; if (!irf) { - compile_error(ast_ctx(self), "ast_function's related ast_value was not generated yet"); + compile_error(ast_ctx(self), "internal error: ast_function's related ast_value was not generated yet"); return false; } @@ -2187,9 +2187,11 @@ bool ast_array_index_codegen(ast_array_index *self, ast_function *func, bool lva if (!lvalue && self->expression.outr) { *out = self->expression.outr; + return true; } if (lvalue && self->expression.outl) { *out = self->expression.outl; + return true; } if (!ast_istype(self->array, ast_value)) {