shithub: scc

Download patch

ref: ed1a8159a3f06e7c4da43567e8dee276d392f3bd
parent: 42fd80186eb88ab683c82a866366d2c72657e1ac
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Mon Nov 1 12:03:26 EDT 2021

cc1: Fold pointer constants

The case of a pointer constant was missed in foldconst()
that implied a dangerous default case that generated a
dangling node without a specified value. To avoid having
this case in the future we add a default case with an
abort.

--- a/src/cmd/cc/cc1/fold.c
+++ b/src/cmd/cc/cc1/fold.c
@@ -293,6 +293,7 @@
 		if (!foldint(op, &aux, ls->u.i, i))
 			return NULL;
 		break;
+	case PTR:
 	case UNSIGNED:
 		u = (rs) ? rs->u.u : 0u;
 		if (!folduint(op, &aux, ls->u.u, u))
@@ -303,6 +304,8 @@
 		if (!foldfloat(op, &aux, ls->u.f, f))
 			return NULL;
 		break;
+	default:
+		abort();
 	}
 	sym = newsym(NS_IDEN, NULL);
 	sym->flags |= SCONSTANT;
@@ -355,6 +358,7 @@
 	default:
 		return np;
 	}
+
 	DBG("FOLD cast %c->%c", oldtp->letter, newtp->letter);
 	freetree(np);
 	sym = newsym(NS_IDEN, NULL);