summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkugwa <kugwa2000@gmail.com>2015-12-09 15:20:52 +0800
committerkugwa <kugwa2000@gmail.com>2015-12-09 17:18:33 +0800
commit78b5848db27fda1d7a8bfc1b1c5afb99d87ebfa1 (patch)
treeb16af172ca90c5f79c6760b46690a4b92dd10267
parent215986bfa3f579405bbe82650ae7343680274ed2 (diff)
downloadcompiler2015-78b5848db27fda1d7a8bfc1b1c5afb99d87ebfa1.tar
compiler2015-78b5848db27fda1d7a8bfc1b1c5afb99d87ebfa1.tar.gz
compiler2015-78b5848db27fda1d7a8bfc1b1c5afb99d87ebfa1.tar.bz2
compiler2015-78b5848db27fda1d7a8bfc1b1c5afb99d87ebfa1.tar.lz
compiler2015-78b5848db27fda1d7a8bfc1b1c5afb99d87ebfa1.tar.xz
compiler2015-78b5848db27fda1d7a8bfc1b1c5afb99d87ebfa1.tar.zst
compiler2015-78b5848db27fda1d7a8bfc1b1c5afb99d87ebfa1.zip
Handle array dimension error of function parameters
Additional changes: 1. Check malloc() 2. Add param_node to avoid long lines
-rw-r--r--src/draw.c10
-rw-r--r--src/semantic-analysis.c16
2 files changed, 17 insertions, 9 deletions
diff --git a/src/draw.c b/src/draw.c
index 8c563f3..d918230 100644
--- a/src/draw.c
+++ b/src/draw.c
@@ -211,9 +211,13 @@ static void print_symbol_type(FILE *fp, CcmmcSymbolType type)
assert(false);
}
- if (ccmmc_symbol_type_is_array(type))
- for (size_t i = 0; i < type.array_dimension; i++)
- fprintf(fp, "[%zu]", type.array_size[i]);
+ if (ccmmc_symbol_type_is_array(type)) {
+ if (type.array_size != NULL)
+ for (size_t i = 0; i < type.array_dimension; i++)
+ fprintf(fp, "[%zu]", type.array_size[i]);
+ else
+ fprintf(fp, "*");
+ }
if (ccmmc_symbol_type_is_function(type)) {
fputs(" (*)(", fp);
diff --git a/src/semantic-analysis.c b/src/semantic-analysis.c
index e023b0c..bdaa090 100644
--- a/src/semantic-analysis.c
+++ b/src/semantic-analysis.c
@@ -541,23 +541,28 @@ static bool process_block(CcmmcAst *block, CcmmcSymbolTable *table)
static bool decl_function(CcmmcAst *func_decl, CcmmcSymbolTable *table)
{
bool any_error = false;
+ CcmmcAst *param_node = func_decl->child->right_sibling->right_sibling;
size_t param_count = 0;
CcmmcSymbolType *param_list = NULL;
// Create an entry for the function in global scope
- if (func_decl->child->right_sibling->right_sibling->child != NULL){
+ if (param_node->child != NULL){
CcmmcAst *param;
size_t i;
- for (param = func_decl->child->right_sibling->right_sibling->child;
+ for (param = param_node->child;
param != NULL; param = param->right_sibling, param_count++);
param_list = malloc(sizeof(CcmmcSymbolType) * param_count);
- for (param = func_decl->child->right_sibling->right_sibling->child, i = 0;
+ ERR_FATAL_CHECK(param_list, malloc);
+ for (param = param_node->child, i = 0;
i < param_count; param = param->right_sibling, i++) {
param_list[i].type_base = ccmmc_symbol_table_retrieve(table,
param->child->value_id.name)->type.type_base;
- if (param->child->right_sibling->value_id.kind == CCMMC_KIND_ID_ARRAY)
+ if (param->child->right_sibling->value_id.kind == CCMMC_KIND_ID_ARRAY) {
param_list[i].array_size = get_array_size(param->child->right_sibling,
&param_list[i].array_dimension);
+ if (param_list[i].array_size == NULL)
+ any_error = true;
+ }
else
param_list[i].array_dimension = 0;
param_list[i].param_valid = false;
@@ -574,8 +579,7 @@ static bool decl_function(CcmmcAst *func_decl, CcmmcSymbolTable *table)
CCMMC_SYMBOL_KIND_FUNCTION, func_type);
// process the function block
- return process_block(func_decl->child->right_sibling->right_sibling->right_sibling,
- table) || any_error;
+ return process_block(param_node->right_sibling, table) || any_error;
}
static bool process_program(CcmmcAst *program, CcmmcSymbolTable *table)