aboutsummaryrefslogtreecommitdiff
path: root/gcc/range-op-float.cc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2023-03-13 18:50:25 -0400
committerMarek Polacek <polacek@redhat.com>2023-04-04 09:13:18 -0400
commitc1aca26b707471ce8051bd03b3fb2217bcdf2df0 (patch)
treeafbb9d5d70561460513075a5f9b939bf8e015a9d /gcc/range-op-float.cc
parent3f0ca7a3e4431534bff3b8eb73709cc822e489b0 (diff)
downloadgcc-c1aca26b707471ce8051bd03b3fb2217bcdf2df0.zip
gcc-c1aca26b707471ce8051bd03b3fb2217bcdf2df0.tar.gz
gcc-c1aca26b707471ce8051bd03b3fb2217bcdf2df0.tar.bz2
sanitizer: missing signed integer overflow errors [PR109107]
Here we're failing to detect a signed overflow with -O because match.pd, since r8-1516, transforms c = (a + 1) - (int) (short int) b; into c = (int) ((unsigned int) a + 4294946117); wrongly eliding the overflow. This kind of problems is usually avoided by using TYPE_OVERFLOW_SANITIZED in the appropriate place. The first match.pd hunk in the patch fixes it. I've constructed a testcase for each of the surrounding cases as well. Then I noticed that fold_binary_loc/associate has the same problem, so I've added a TYPE_OVERFLOW_SANITIZED there as well (it may be too coarse, sorry). Then I found yet another problem, but instead of fixing it now I've opened 109134. I could probably go on and find a dozen more. PR sanitizer/109107 gcc/ChangeLog: * fold-const.cc (fold_binary_loc): Use TYPE_OVERFLOW_SANITIZED when associating. * match.pd: Use TYPE_OVERFLOW_SANITIZED. gcc/testsuite/ChangeLog: * c-c++-common/ubsan/pr109107-1.c: New test. * c-c++-common/ubsan/pr109107-2.c: New test. * c-c++-common/ubsan/pr109107-3.c: New test. * c-c++-common/ubsan/pr109107-4.c: New test.
Diffstat (limited to 'gcc/range-op-float.cc')
0 files changed, 0 insertions, 0 deletions