Skip to content

Commit 5861bb4

Browse files
committed
Fix integer overflow in RV32A
To prevent potential arithmetic overflow issues leading to undefined behavior, replace the usage of int32_t with uint32_t in the RV32A implementation. This ensures that all arithmetic operations are performed on unsigned 32-bit integers, avoiding any undefined behavior due to overflow.
1 parent f59f70c commit 5861bb4

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

src/rv32_template.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,7 +1363,7 @@ RVOP(
13631363
{
13641364
if (ir->rd)
13651365
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
1366-
const int32_t res = (int32_t) rv->X[ir->rd] + (int32_t) rv->X[ir->rs2];
1366+
const uint32_t res = rv->X[ir->rd] + rv->X[ir->rs2];
13671367
rv->io.mem_write_w(rv->X[ir->rs1], res);
13681368
},
13691369
GEN({
@@ -1376,7 +1376,7 @@ RVOP(
13761376
{
13771377
if (ir->rd)
13781378
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
1379-
const int32_t res = rv->X[ir->rd] ^ rv->X[ir->rs2];
1379+
const uint32_t res = rv->X[ir->rd] ^ rv->X[ir->rs2];
13801380
rv->io.mem_write_w(rv->X[ir->rs1], res);
13811381
},
13821382
GEN({
@@ -1389,7 +1389,7 @@ RVOP(
13891389
{
13901390
if (ir->rd)
13911391
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
1392-
const int32_t res = rv->X[ir->rd] & rv->X[ir->rs2];
1392+
const uint32_t res = rv->X[ir->rd] & rv->X[ir->rs2];
13931393
rv->io.mem_write_w(rv->X[ir->rs1], res);
13941394
},
13951395
GEN({
@@ -1402,7 +1402,7 @@ RVOP(
14021402
{
14031403
if (ir->rd)
14041404
rv->X[ir->rd] = rv->io.mem_read_w(rv->X[ir->rs1]);
1405-
const int32_t res = rv->X[ir->rd] | rv->X[ir->rs2];
1405+
const uint32_t res = rv->X[ir->rd] | rv->X[ir->rs2];
14061406
rv->io.mem_write_w(rv->X[ir->rs1], res);
14071407
},
14081408
GEN({

0 commit comments

Comments
 (0)