shithub: MicroHs

Download patch

ref: 966103e5c11cfff2c3577364eb9b4879c987a282
parent: ad5b5061182f2c695a37bb9b16dca6fe74edbbf3
parent: 8f72f4d646f9ae66eaeecd18a003f5d316789436
author: Lennart Augustsson <lennart@augustsson.net>
date: Thu Feb 8 05:53:11 EST 2024

Merge pull request #35 from jmaessen/more-ubsan

More ubsan fixes

--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -2243,7 +2243,7 @@
 #define OPDBL1(e)      do { CHECK(1); xd = evaldbl(ARG(TOP(0)));                            e; POP(1); n = TOP(-1); } while(0);
 #define OPDBL2(e)      do { CHECK(2); xd = evaldbl(ARG(TOP(0))); yd = evaldbl(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);
 #define OPPTR2(e)      do { CHECK(2); xp = evalptr(ARG(TOP(0))); yp = evalptr(ARG(TOP(1))); e; POP(2); n = TOP(-1); } while(0);
-#define ARITHUN(op)    do { OPINT1(r = op xi); SETINT(n, r); RET; } while(0)
+#define ARITHUNU(op)    do { OPINT1(r = (value_t)(op (uvalue_t)xi)); SETINT(n, r); RET; } while(0)
 #define ARITHBIN(op)   do { OPINT2(r = xi op yi); SETINT(n, r); RET; } while(0)
 #define ARITHBINU(op)  do { OPINT2(r = (value_t)((uvalue_t)xi op (uvalue_t)yi)); SETINT(n, r); RET; } while(0)
 #define FARITHUN(op)   do { OPDBL1(rd = op xd); SETDBL(n, rd); RET; } while(0)
@@ -2308,11 +2308,11 @@
     case T_SUBR: OPINT2(r = yi - xi); SETINT(n, r); RET;
     case T_UQUOT: ARITHBINU(/);
     case T_UREM:  ARITHBINU(%);
-    case T_NEG:  ARITHUN(-);
+    case T_NEG:  ARITHUNU(-);
     case T_AND:  ARITHBIN(&);
     case T_OR:   ARITHBIN(|);
     case T_XOR:  ARITHBIN(^);
-    case T_INV:  ARITHUN(~);
+    case T_INV:  ARITHUNU(~);
     case T_SHL:  ARITHBIN(<<);
     case T_SHR:  ARITHBINU(>>);
     case T_ASHR: ARITHBIN(>>);
--