On Tue, 29 Jun 2021, Jakub Jelinek wrote: > Hi! > > When we have (intptr_t) x == cst where x has REFERENCE_TYPE, this > optimization creates x == cst out of it where cst has REFERENCE_TYPE. > If it is done in GENERIC folding, it can results in ubsan failures > where the INTEGER_CST with REFERENCE_TYPE is instrumented. > > Fixed by deferring it to GIMPLE folding in this case. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. > 2021-06-29 Jakub Jelinek <ja...@redhat.com> > > PR c++/101210 > * match.pd ((intptr_t)x eq/ne CST to x eq/ne (typeof x) CST): Don't > perform the optimization in GENERIC when sanitizing and x has a > reference type. > > * g++.dg/ubsan/pr101210.C: New test. > > --- gcc/match.pd.jj 2021-06-14 12:27:18.605410685 +0200 > +++ gcc/match.pd 2021-06-28 10:08:22.535038549 +0200 > @@ -5124,7 +5124,12 @@ (define_operator_list COND_TERNARY > (cmp (convert @0) INTEGER_CST@1) > (if (((POINTER_TYPE_P (TREE_TYPE (@0)) > && !FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (@0))) > - && INTEGRAL_TYPE_P (TREE_TYPE (@1))) > + && INTEGRAL_TYPE_P (TREE_TYPE (@1)) > + /* Don't perform this optimization in GENERIC if @0 has reference > + type when sanitizing. See PR101210. */ > + && !(GENERIC > + && TREE_CODE (TREE_TYPE (@0)) == REFERENCE_TYPE > + && (flag_sanitize & (SANITIZE_NULL | SANITIZE_ALIGNMENT)))) > || (INTEGRAL_TYPE_P (TREE_TYPE (@0)) > && POINTER_TYPE_P (TREE_TYPE (@1)) > && !FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (@1))))) > --- gcc/testsuite/g++.dg/ubsan/pr101210.C.jj 2021-06-28 10:08:37.773825299 > +0200 > +++ gcc/testsuite/g++.dg/ubsan/pr101210.C 2021-06-28 10:06:10.647884171 > +0200 > @@ -0,0 +1,13 @@ > +// PR c++/101210 > +// { dg-do run } > +// { dg-options "-fsanitize=null,alignment > -fno-sanitize-recover=null,alignment" } > + > +int v[2]; > +int > +main () > +{ > + int x; > + int &y = x; > + v[0] = reinterpret_cast<__INTPTR_TYPE__>(&y) == 0; > + v[1] = reinterpret_cast<__INTPTR_TYPE__>(&y) == 1; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)