various null-dereference problems fixed
authorerikb <none@none>
Tue, 2 Sep 1986 15:22:54 +0000 (15:22 +0000)
committererikb <none@none>
Tue, 2 Sep 1986 15:22:54 +0000 (15:22 +0000)
lang/cem/cemcom/code.c
lang/cem/cemcom/expr.c
lang/cem/cemcom/idf.c
lang/cem/cemcom/statement.g
lang/cem/cemcom/struct.c
lang/cem/cemcom/switch.c

index b56e16e..c273ba3 100644 (file)
@@ -183,7 +183,12 @@ begin_proc(name, def)      /* to be called when entering a procedure       */
                DfaStartFunction(name);
 #endif DATAFLOW
 
-       func_tp = def->df_type->tp_up;
+       if (def->df_type->tp_fund != FUNCTION) {
+               error("making function body for non-function");
+               func_tp = error_type;
+       }
+       else
+               func_tp = def->df_type->tp_up;
        size = ATW(func_tp->tp_size);
        C_pro_narg(name);
        if (is_struct_or_union(func_tp->tp_fund))       {
index 3549c84..4fa8cf7 100644 (file)
@@ -171,6 +171,7 @@ idf2expr(expr)
        /* now def != 0 */
        if (def->df_type->tp_fund == LABEL) {
                expr_error(expr, "illegal use of label %s", idf->id_text);
+               expr->ex_type = error_type;
        }
        else {
                def->df_used = 1;
index 05e74f8..aa6c48f 100644 (file)
@@ -181,7 +181,7 @@ declare_idf(ds, dc, lvl)
                /*      at the L_FORMAL1 level there is no type specified yet
                */
                ASSERT(lvl == L_FORMAL1);
-               type = 0;
+               type = int_type;        /* may change at L_FORMAL2 */
        }
        else    {
                /* combine the decspecs and the declarator into one type */
@@ -583,7 +583,7 @@ declare_parameter(idf)
 {
        /*      idf is declared as a formal.
        */
-       add_def(idf, FORMAL, (struct type *)0, level);
+       add_def(idf, FORMAL, int_type, level);
 }
 
 declare_enum(tp, idf, l)
@@ -616,8 +616,6 @@ declare_formals(fp)
                struct idf *idf = se->se_idf;
                struct def *def = idf->id_def;
                
-               if (def->df_type == 0)
-                       def->df_type = int_type; /* default type */
                def->df_address = f_offset;
 
                /*      the alignment convention for parameters is: align on
index 62ce1b3..4109ba0 100644 (file)
@@ -279,7 +279,7 @@ switch_statement
        '('
        expression(&expr)
                {
-                       code_startswitch(expr);
+                       code_startswitch(&expr);
                }
        ')'
        statement
index b7e266e..b5af15c 100644 (file)
@@ -310,7 +310,7 @@ idf2sdef(idf, tp)
        *sdefp = sdef = new_sdef();
        clear((char *)sdef, sizeof(struct sdef));
        sdef->sd_idf = idf;
-       sdef->sd_type = error_type;
+       sdef->sd_stype = sdef->sd_type = error_type;
        return sdef;
 }
 
index 30fd0ab..4a73673 100644 (file)
@@ -32,8 +32,8 @@ static struct switch_hdr *switch_stack = 0;
        For simplicity, we suppose int_size == word_size.
 */
 
-code_startswitch(expr)
-       struct expr *expr;
+code_startswitch(expp)
+       struct expr **expp;
 {
        /*      Check the expression, stack a new case header and
                fill in the necessary fields.
@@ -41,17 +41,17 @@ code_startswitch(expr)
        register label l_table = text_label();
        register label l_break = text_label();
        register struct switch_hdr *sh = new_switch_hdr();
-       int fund = any2arith(&expr, SWITCH);    /* INT, LONG or DOUBLE */
+       int fund = any2arith(expp, SWITCH);     /* INT, LONG or DOUBLE */
        
        switch (fund)   {
        case LONG:
                if (options['R'])
                        warning("long in switch (cast to int)");
-               int2int(&expr, int_type);
+               int2int(expp, int_type);
                break;
        case DOUBLE:
                error("float/double in switch");
-               erroneous2int(&expr);
+               erroneous2int(expp);
                break;
        }
        
@@ -60,12 +60,12 @@ code_startswitch(expr)
        sh->sh_default = 0;
        sh->sh_table = l_table;
        sh->sh_nrofentries = 0;
-       sh->sh_type = expr->ex_type;    /* the expression switched      */
+       sh->sh_type = (*expp)->ex_type; /* the expression switched      */
        sh->sh_lowerbd = sh->sh_upperbd = (arith)0;     /* immaterial ??? */
        sh->sh_entries = (struct case_entry *) 0; /* case-entry list    */
        sh->next = switch_stack;        /* push onto switch-stack       */
        switch_stack = sh;
-       code_expr(expr, RVAL, TRUE, NO_LABEL, NO_LABEL);
+       code_expr(*expp, RVAL, TRUE, NO_LABEL, NO_LABEL);
                                        /* evaluate the switch expr.    */
        C_bra(l_table);                 /* goto start of switch_table   */
 }