mirror of
https://github.com/gbdev/rgbds.git
synced 2026-09-23 14:17:06 +00:00
Avoid signed overflow in RGBLINK's +, -, and * (#2060)
RGBASM computes these with unsigned arithmetic and casts back, since signed overflow is UB in C++, but RGBLINK's RPN evaluator used `int32_t` directly, so `src/link/patch.cpp` tripped UBSan on lines 117, 121, and 124. Share the three operators through `opmath.cpp` so both evaluators stay in step.
This commit is contained in:
+3
-3
@@ -114,14 +114,14 @@ static int32_t computeRPNExpr(Patch const &patch, std::vector<Symbol> const &fil
|
||||
int32_t value;
|
||||
switch (command) {
|
||||
case RPN_ADD:
|
||||
value = popRPN(patch) + popRPN(patch);
|
||||
value = op_add(popRPN(patch), popRPN(patch));
|
||||
break;
|
||||
case RPN_SUB:
|
||||
value = popRPN(patch);
|
||||
value = popRPN(patch) - value;
|
||||
value = op_sub(popRPN(patch), value);
|
||||
break;
|
||||
case RPN_MUL:
|
||||
value = popRPN(patch) * popRPN(patch);
|
||||
value = op_mul(popRPN(patch), popRPN(patch));
|
||||
break;
|
||||
case RPN_DIV:
|
||||
value = popRPN(patch);
|
||||
|
||||
Reference in New Issue
Block a user