Browse code

uxn_eval: multiply as two uint32s to avoid UB

Sigrid Solveig Haflínudóttir authored on 25/12/2021 22:29:36
Showing 2 changed files
... ...
@@ -120,7 +120,7 @@ uxn_eval(Uxn *u, Uint16 vec)
120 120
 			/* Arithmetic */
121 121
 			case 0x18: /* ADD */ a = pop(u->src), b = pop(u->src); push(u->src, b + a); break;
122 122
 			case 0x19: /* SUB */ a = pop(u->src), b = pop(u->src); push(u->src, b - a); break;
123
-			case 0x1a: /* MUL */ a = pop(u->src), b = pop(u->src); push(u->src, b * a); break;
123
+			case 0x1a: /* MUL */ a = pop(u->src), b = pop(u->src); push(u->src, (Uint32)b * a); break;
124 124
 			case 0x1b: /* DIV */ a = pop(u->src), b = pop(u->src); if(a == 0) { u->src->error = 3; a = 1; } push(u->src, b / a); break;
125 125
 			case 0x1c: /* AND */ a = pop(u->src), b = pop(u->src); push(u->src, b & a); break;
126 126
 			case 0x1d: /* ORA */ a = pop(u->src), b = pop(u->src); push(u->src, b | a); break;
... ...
@@ -138,7 +138,7 @@ uxn_eval(Uxn *u, Uint16 vec)
138 138
 int
139 139
 uxn_boot(Uxn *u)
140 140
 {
141
-	unsigned int i;
141
+	Uint32 i;
142 142
 	char *cptr = (char *)u;
143 143
 	for(i = 0; i < sizeof(*u); ++i)
144 144
 		cptr[i] = 0x00;
... ...
@@ -13,6 +13,7 @@ typedef unsigned char Uint8;
13 13
 typedef signed char Sint8;
14 14
 typedef unsigned short Uint16;
15 15
 typedef signed short Sint16;
16
+typedef unsigned int Uint32;
16 17
 
17 18
 #define PAGE_PROGRAM 0x0100
18 19