[Bug c++/91993] [8/9/10 Regression] Spurious -Wconversion warning with -fsanitize=undefined since r6-4886-gcda0a029f45d20f4

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Mar 23 18:49:09 GMT 2020


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

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

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

commit r10-7344-gca6c722561ce9b9dc7b59cfd9d29c9b466732721
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Mon Mar 23 19:47:24 2020 +0100

    c++: Handle COMPOUND_EXPRs in get_narrower and
warnings_for_convert_and_check [PR91993]

    As the testcases shows, the -Wconversion warning behaves quite differently
    when -fsanitize=undefined vs. when not sanitizing, but in the end it is
    not something specific to sanitizing, if a user uses
      return static_cast<uc>(static_cast<uc>((d++, a) << 1U) | b) | c;
    instead of
      return static_cast<uc>(static_cast<uc>(a << 1U) | b) | c;
    and thus there is some COMPOUND_EXPR involved, cp_build_binary_op behaves
    significantly different, e.g. shorten_binary_op will have different result
    (uc for the case without COMPOUND_EXPR, int with it), but it isn't limited
    to that.

    > How about improving get_narrower to handle COMPOUND_EXPR?  I'd think that
    > would do the trick without affecting evaluation order.

    Not completely, had to change also warnings_for_convert_and_check, but with
    that it works.  The float-cast-overflow* changes are needed because now
with
    -O1+ we emit lots of -Woverflow warnings on the testcase, but we do emit
    those warnings on the testcase even when compiling just with -O1 and
without
    -fsanitize=float-cast-overflow, so it seems to me a change in the right
    direction, having -fsanitize= or explicit comma expressions smaller effect
    on the warnings that are emitted.

    2020-03-23  Jakub Jelinek  <jakub@redhat.com>

            PR c++/91993
            * tree.c (get_narrower): Handle COMPOUND_EXPR by recursing on
            ultimate rhs and if returned something different, reconstructing
            the COMPOUND_EXPRs.

            * c-warn.c (warnings_for_convert_and_check): For expr and/or
            result being COMPOUND_EXPRs, skip to ultimate rhs.

            * g++.dg/warn/Wconversion-pr91993.C: New test.
            * g++.dg/ubsan/pr91993.C: New test.
            * c-c++-common/ubsan/float-cast-overflow-1.c: Add -Wno-overflow
            to dg-options.
            * c-c++-common/ubsan/float-cast-overflow-2.c: Likewise.
            * c-c++-common/ubsan/float-cast-overflow-4.c: Likewise.


More information about the Gcc-bugs mailing list