sanitizer: missing signed integer overflow errors [PR109107]
authorMarek Polacek <polacek@redhat.com>
Mon, 13 Mar 2023 22:50:25 +0000 (18:50 -0400)
committerMarek Polacek <polacek@redhat.com>
Tue, 4 Apr 2023 13:13:18 +0000 (09:13 -0400)
commitc1aca26b707471ce8051bd03b3fb2217bcdf2df0
treeafbb9d5d70561460513075a5f9b939bf8e015a9d
parent3f0ca7a3e4431534bff3b8eb73709cc822e489b0
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.
gcc/fold-const.cc
gcc/match.pd
gcc/testsuite/c-c++-common/ubsan/pr109107-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/ubsan/pr109107-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/ubsan/pr109107-3.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/ubsan/pr109107-4.c [new file with mode: 0644]