c++: -fsanitize=vptr and -fstrong-eval-order. [PR95221]
authorJason Merrill <jason@redhat.com>
Thu, 21 May 2020 04:22:10 +0000 (00:22 -0400)
committerJason Merrill <jason@redhat.com>
Fri, 22 May 2020 21:02:03 +0000 (17:02 -0400)
commit72af65b91cc2a2eb726afe56af6b44d6c57bb10f
tree8d6d212d01adba64d540a4be66e7d5befedcf4ee
parent2221fb6f668a7edc8b8aad69772907aeabbbb0be
c++: -fsanitize=vptr and -fstrong-eval-order. [PR95221]

With -fstrong-eval-order=all we evaluate the function address before the
arguments.  But this caused trouble with virtual functions and
-fsanitize=vptr; we would do vptr sanitization as part of calculating the
'this' argument, and separately look at the vptr in order to find the
function address.  Without -fstrong-eval-order=all 'this' is evaluated
first, but with that flag the function address is evaluated first, so we
would access the null vptr before sanitizing it.

Fixed by instrumenting the OBJ_TYPE_REF of a virtual function call instead
of the 'this' argument.

This issue suggests that we should be running the ubsan tests in multiple
standard modes like the rest of the G++ testsuite, so I've made that change
as well.

gcc/cp/ChangeLog:

* cp-ubsan.c (cp_ubsan_maybe_instrument_member_call): For a virtual
call, instrument the OBJ_TYPE_REF.

gcc/testsuite/ChangeLog:

* g++.dg/ubsan/ubsan.exp: Use g++-dg-runtest.
* c-c++-common/ubsan/bounds-13.c: Adjust.
* c-c++-common/ubsan/bounds-2.c: Adjust.
* c-c++-common/ubsan/div-by-zero-1.c: Adjust.
* c-c++-common/ubsan/div-by-zero-6.c: Adjust.
* c-c++-common/ubsan/div-by-zero-7.c: Adjust.
* c-c++-common/ubsan/overflow-add-1.c: Adjust.
* c-c++-common/ubsan/overflow-add-2.c: Adjust.
* c-c++-common/ubsan/overflow-int128.c: Adjust.
* c-c++-common/ubsan/overflow-sub-1.c: Adjust.
* c-c++-common/ubsan/overflow-sub-2.c: Adjust.
* g++.dg/ubsan/pr85029.C: Adjust.
* g++.dg/ubsan/vptr-14.C: Adjust.
14 files changed:
gcc/cp/cp-ubsan.c
gcc/testsuite/c-c++-common/ubsan/bounds-13.c
gcc/testsuite/c-c++-common/ubsan/bounds-2.c
gcc/testsuite/c-c++-common/ubsan/div-by-zero-1.c
gcc/testsuite/c-c++-common/ubsan/div-by-zero-6.c
gcc/testsuite/c-c++-common/ubsan/div-by-zero-7.c
gcc/testsuite/c-c++-common/ubsan/overflow-add-1.c
gcc/testsuite/c-c++-common/ubsan/overflow-add-2.c
gcc/testsuite/c-c++-common/ubsan/overflow-int128.c
gcc/testsuite/c-c++-common/ubsan/overflow-sub-1.c
gcc/testsuite/c-c++-common/ubsan/overflow-sub-2.c
gcc/testsuite/g++.dg/ubsan/pr85029.C
gcc/testsuite/g++.dg/ubsan/ubsan.exp
gcc/testsuite/g++.dg/ubsan/vptr-14.C