Message ID | 20160428141001.GP28445@redhat.com |
---|---|
State | New |
Headers | show |
On Thu, Apr 28, 2016 at 04:10:01PM +0200, Marek Polacek wrote: > That works too, though it of course affects all users, not just ubsan. Here's Of course, but I think that is a good thing ;) > the patch with your suggested change. > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > 2016-04-28 Marek Polacek <polacek@redhat.com> > Jakub Jelinek <jakub@redhat.com> > > PR sanitizer/70342 > * fold-const.c (tree_single_nonzero_warnv_p): For TARGET_EXPR, use > TARGET_EXPR_SLOT as a base. > > * g++.dg/ubsan/null-7.C: New test. Ok for trunk. For 6.2 dunno, either the same patch after a while, or perhaps your original patch is safer (though, wonder if e.g. one can construct a testcase where it will use instrument &(TARGET_EXPR <...>.field) nested many times and still trigger the compile time hog with your patch). Jakub
On Thu, Apr 28, 2016 at 04:15:41PM +0200, Jakub Jelinek wrote: > On Thu, Apr 28, 2016 at 04:10:01PM +0200, Marek Polacek wrote: > > That works too, though it of course affects all users, not just ubsan. Here's > > Of course, but I think that is a good thing ;) > > > the patch with your suggested change. > > > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > > > 2016-04-28 Marek Polacek <polacek@redhat.com> > > Jakub Jelinek <jakub@redhat.com> > > > > PR sanitizer/70342 > > * fold-const.c (tree_single_nonzero_warnv_p): For TARGET_EXPR, use > > TARGET_EXPR_SLOT as a base. > > > > * g++.dg/ubsan/null-7.C: New test. > > Ok for trunk. Thanks, committed. > For 6.2 dunno, either the same patch after a while, or perhaps your original > patch is safer (though, wonder if e.g. one can construct a testcase where it > will use instrument &(TARGET_EXPR <...>.field) nested many times and still > trigger the compile time hog with your patch). Dunno either. I think I'll backport the same patch after a week or so. Marek
diff --git gcc/fold-const.c gcc/fold-const.c index 96d8484..171ac83 100644 --- gcc/fold-const.c +++ gcc/fold-const.c @@ -13531,6 +13531,9 @@ tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p) if (!DECL_P (base)) base = get_base_address (base); + if (base && TREE_CODE (base) == TARGET_EXPR) + base = TARGET_EXPR_SLOT (base); + if (!base) return false; diff --git gcc/testsuite/g++.dg/ubsan/null-7.C gcc/testsuite/g++.dg/ubsan/null-7.C index e69de29..8284bc7 100644 --- gcc/testsuite/g++.dg/ubsan/null-7.C +++ gcc/testsuite/g++.dg/ubsan/null-7.C @@ -0,0 +1,24 @@ +// PR sanitizer/70342 +// { dg-do compile } +// { dg-options "-fsanitize=null" } + +class A {}; +class B { +public: + B(A); +}; +class C { +public: + C operator<<(B); +}; +class D { + D(const int &); + C m_blackList; +}; +D::D(const int &) { + m_blackList << A() << A() << A() << A() << A() << A() << A() << A() << A() + << A() << A() << A() << A() << A() << A() << A() << A() << A() + << A() << A() << A() << A() << A() << A() << A() << A() << A() + << A() << A() << A() << A() << A() << A() << A() << A() << A() + << A() << A() << A() << A() << A() << A() << A() << A() << A(); +}