shithub: scc

Download patch

ref: e56b22693ff12207d5106ed3c9aab1ba77cbb096
parent: 3a13451527967209d4e2e9d8bf8248659bfafb3f
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Jan 19 07:18:41 EST 2016

Improve error recovery in init.c

--- a/cc1/init.c
+++ b/cc1/init.c
@@ -1,4 +1,5 @@
 
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -110,7 +111,7 @@
 
 	if ((n = ip->max) == 0) {
 		v = NULL;
-	} else if (n >= n * sizeof(*v)) {
+	} else if (n > SIZE_MAX / sizeof(*v)) {
 		errorp("compound literal too big");
 		return constnode(zero);
 	} else {
@@ -240,8 +241,11 @@
 	Node *np;
 	int flags = sym->flags;
 
-	if (tp->op == FTN)
-		errorp("function '%s' is initialized like a variable", sym->name);
+	if (tp->op == FTN) {
+		errorp("function '%s' is initialized like a variable",
+		       sym->name);
+		tp = inttype;
+	}
 	np = initialize(tp);
 
 	emit(ODECL, sym);
@@ -248,8 +252,10 @@
 	if (flags & ISDEFINED) {
 		errorp("redeclaration of '%s'", sym->name);
 	} else if ((flags & (ISGLOBAL|ISLOCAL|ISPRIVATE)) != 0) {
-		if (!np->constant)
+		if (!np->constant) {
 			errorp("initializer element is not constant");
+			return;
+		}
 		emit(OINIT, np);
 		sym->flags |= ISDEFINED;
 	} else if ((flags & (ISEXTERN|ISTYPEDEF)) != 0) {