https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98206

--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:a9ec9902d7f1a9bf7a2778c3fb8fc75bc2df2cef

commit r11-6375-ga9ec9902d7f1a9bf7a2778c3fb8fc75bc2df2cef
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Dec 31 10:20:39 2020 +0100

    fold-const: Avoid (cast) ((cast2) x p+ y) folding for -fsanitize=alignment
[PR98206]

    The following testcase is diagnosed by UBSan as invalid, even when it is
    valid.
    We have a derived type Base2 at offset 1 with alignment 1 and do:
    (const Derived &) ((const Base2 *) this + -1)
    but the folder before ubsan in the FE gets a chance to instrument it
    optimizes that into:
    (const Derived &) this + -1
    and so we require that this has 8-byte alignment which Derived class needs.

    Fixed by avoiding such an optimization when -fsanitize=alignment is in
    effect if it would affect the alignments (and guarded with !in_gimple_form
    because we don't really care during GIMPLE, though pointer conversions are
    useless then and so such folding isn't needed very much during GIMPLE).

    2020-12-31  Jakub Jelinek  <ja...@redhat.com>

            PR c++/98206
            * fold-const.c: Include asan.h.
            (fold_unary_loc): Don't optimize (ptr_type) (((ptr_type2) x) p+ y)
            into ((ptr_type) x) p+ y if sanitizing alignment in GENERIC and
            ptr_type points to type with higher alignment than ptr_type2.

            * g++.dg/ubsan/align-4.C: New test.

Reply via email to