public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/104426] New: -fsanitize=undefined causes constexpr failures
@ 2022-02-07 17:46 pdimov at gmail dot com
  2022-02-07 21:14 ` [Bug c++/104426] " redi at gcc dot gnu.org
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: pdimov at gmail dot com @ 2022-02-07 17:46 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 104426
           Summary: -fsanitize=undefined causes constexpr failures
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pdimov at gmail dot com
  Target Milestone: ---

The following program

```
struct category
{
    constexpr bool failed() const noexcept
    {
        return true;
    }
};

inline constexpr category s_cat;

struct condition
{
    category const* cat_;

    constexpr bool failed() const noexcept
    {
        if( cat_ )
        {
            return cat_->failed();
        }
        else
        {
            return false;
        }
    }
};

int main()
{
    constexpr condition cond{ &s_cat };
    static_assert( cond.failed() );
}
```

compiles without -fsanitize=undefined (https://godbolt.org/z/Pn9M5ocfz), but
fails with it (https://godbolt.org/z/KKc8Tb9qe) with

```
<source>: In function 'int main()':
<source>:31:31: error: non-constant condition for static assertion
   31 |     static_assert( cond.failed() );
      |                    ~~~~~~~~~~~^~
<source>:31:31:   in 'constexpr' expansion of 'cond.condition::failed()'
<source>:17:13: error: '((& s_cat) != 0)' is not a constant expression
   17 |         if( cat_ )
      |             ^~~~
```

This happens under all GCC versions starting from 7.

(The above is an extract from the test suite for
boost::system::error_condition.)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug c++/104426] -fsanitize=undefined causes constexpr failures
  2022-02-07 17:46 [Bug c++/104426] New: -fsanitize=undefined causes constexpr failures pdimov at gmail dot com
@ 2022-02-07 21:14 ` redi at gcc dot gnu.org
  2022-02-07 21:15 ` redi at gcc dot gnu.org
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: redi at gcc dot gnu.org @ 2022-02-07 21:14 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Maybe a dup of my PR 71962

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug c++/104426] -fsanitize=undefined causes constexpr failures
  2022-02-07 17:46 [Bug c++/104426] New: -fsanitize=undefined causes constexpr failures pdimov at gmail dot com
  2022-02-07 21:14 ` [Bug c++/104426] " redi at gcc dot gnu.org
@ 2022-02-07 21:15 ` redi at gcc dot gnu.org
  2022-02-07 21:17 ` jakub at gcc dot gnu.org
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: redi at gcc dot gnu.org @ 2022-02-07 21:15 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
And PR 67762

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug c++/104426] -fsanitize=undefined causes constexpr failures
  2022-02-07 17:46 [Bug c++/104426] New: -fsanitize=undefined causes constexpr failures pdimov at gmail dot com
  2022-02-07 21:14 ` [Bug c++/104426] " redi at gcc dot gnu.org
  2022-02-07 21:15 ` redi at gcc dot gnu.org
@ 2022-02-07 21:17 ` jakub at gcc dot gnu.org
  2022-02-07 21:29 ` pdimov at gmail dot com
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: jakub at gcc dot gnu.org @ 2022-02-07 21:17 UTC (permalink / raw)
  To: gcc-bugs

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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
That's a consequence of -fsanitize=undefined turning on
-fno-delete-null-pointer-checks (it has to, otherwise -fsanitize=null wouldn't
work properly).
And -fno-delete-null-pointer-checks says that variables or functions can be
placed at NULL address.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug c++/104426] -fsanitize=undefined causes constexpr failures
  2022-02-07 17:46 [Bug c++/104426] New: -fsanitize=undefined causes constexpr failures pdimov at gmail dot com
                   ` (2 preceding siblings ...)
  2022-02-07 21:17 ` jakub at gcc dot gnu.org
@ 2022-02-07 21:29 ` pdimov at gmail dot com
  2022-02-08  9:01 ` rguenth at gcc dot gnu.org
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: pdimov at gmail dot com @ 2022-02-07 21:29 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Peter Dimov <pdimov at gmail dot com> ---
FWIW, I agree with everything Martin Sebor says in PR71962.
-fallow-address-zero is an entirely separate feature, and shouldn't be implied
by -fsanitize=undefined.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug c++/104426] -fsanitize=undefined causes constexpr failures
  2022-02-07 17:46 [Bug c++/104426] New: -fsanitize=undefined causes constexpr failures pdimov at gmail dot com
                   ` (3 preceding siblings ...)
  2022-02-07 21:29 ` pdimov at gmail dot com
@ 2022-02-08  9:01 ` rguenth at gcc dot gnu.org
  2022-02-08 10:52 ` jakub at gcc dot gnu.org
  2024-05-15  9:08 ` redi at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-02-08  9:01 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #3)
> That's a consequence of -fsanitize=undefined turning on
> -fno-delete-null-pointer-checks (it has to, otherwise -fsanitize=null
> wouldn't work properly).
> And -fno-delete-null-pointer-checks says that variables or functions can be
> placed at NULL address.

Note that's "historical" mostly, the correct way to check whether objects can
be at NULL address is the corresponding address-space hook.  Of course that
leaves us with no way for the user to override what the target thinks (unless
the target provides its own way to do that).

IMHO we can simply take away this option from the user, it was a mistake to
document it that way when it had this effect due to lack of a better way.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug c++/104426] -fsanitize=undefined causes constexpr failures
  2022-02-07 17:46 [Bug c++/104426] New: -fsanitize=undefined causes constexpr failures pdimov at gmail dot com
                   ` (4 preceding siblings ...)
  2022-02-08  9:01 ` rguenth at gcc dot gnu.org
@ 2022-02-08 10:52 ` jakub at gcc dot gnu.org
  2024-05-15  9:08 ` redi at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: jakub at gcc dot gnu.org @ 2022-02-08 10:52 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Created attachment 52369
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52369&action=edit
gcc12-pr104426.patch

Untested fix.
This stops the implied setting of -fno-delete-null-pointer-checks for
sanitizers and instead introduces an inline function that decides if null
pointer checks should be done or not.  In initializers and C++ manifestly
constant expressions only the -f{,no-}delete-null-pointer-checks from command
line or implied from some DSP targets will be honored (and separate question is
if automatic vars can be assumed to be non-NULL even on those targets), while
outside of those we keep what we've been doing before, i.e. UBSan disables
those optimizations so that -fsanitize=null etc. can continue working
correctly.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Bug c++/104426] -fsanitize=undefined causes constexpr failures
  2022-02-07 17:46 [Bug c++/104426] New: -fsanitize=undefined causes constexpr failures pdimov at gmail dot com
                   ` (5 preceding siblings ...)
  2022-02-08 10:52 ` jakub at gcc dot gnu.org
@ 2024-05-15  9:08 ` redi at gcc dot gnu.org
  6 siblings, 0 replies; 8+ messages in thread
From: redi at gcc dot gnu.org @ 2024-05-15  9:08 UTC (permalink / raw)
  To: gcc-bugs

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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2024-05-15
     Ever confirmed|0                           |1

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-05-15  9:08 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-07 17:46 [Bug c++/104426] New: -fsanitize=undefined causes constexpr failures pdimov at gmail dot com
2022-02-07 21:14 ` [Bug c++/104426] " redi at gcc dot gnu.org
2022-02-07 21:15 ` redi at gcc dot gnu.org
2022-02-07 21:17 ` jakub at gcc dot gnu.org
2022-02-07 21:29 ` pdimov at gmail dot com
2022-02-08  9:01 ` rguenth at gcc dot gnu.org
2022-02-08 10:52 ` jakub at gcc dot gnu.org
2024-05-15  9:08 ` redi at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).