public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor
@ 2014-12-23 22:58 mw_triad at users dot sourceforge.net
  2014-12-23 23:33 ` [Bug libstdc++/64399] " redi at gcc dot gnu.org
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: mw_triad at users dot sourceforge.net @ 2014-12-23 22:58 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 64399
           Summary: g++ does not diagnose when upcasting owning pointer
                    (e.g. unique_ptr) with non-virtual destructor
           Product: gcc
           Version: 4.8.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mw_triad at users dot sourceforge.net

Consider the following code:

  #include <memory>

  struct X { ~X(); };
  struct Y : X { ~Y(); };

  std::unique_ptr<Y> f();
  void g()
  {
    std::unique_ptr<X> x = f();
  }

This code is almost certainly broken; ownership of the constructed Y is
transferred to an owning unique_ptr in a way that will most likely (in general;
"always" in this specific example) result in Y's destructor never being called.

It seems pretty silly that there is no diagnostic for this. There ought to be a
warning in unique_ptr's conversion operator converting from Derived to Base if
~Base is not virtual. (Arranging at the library level to trip
-Wnon-virtual-dtor seems logical.)


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

* [Bug libstdc++/64399] g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor
  2014-12-23 22:58 [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor mw_triad at users dot sourceforge.net
@ 2014-12-23 23:33 ` redi at gcc dot gnu.org
  2014-12-23 23:37 ` mw_triad at users dot sourceforge.net
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: redi at gcc dot gnu.org @ 2014-12-23 23:33 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
PR 58876


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

* [Bug libstdc++/64399] g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor
  2014-12-23 22:58 [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor mw_triad at users dot sourceforge.net
  2014-12-23 23:33 ` [Bug libstdc++/64399] " redi at gcc dot gnu.org
@ 2014-12-23 23:37 ` mw_triad at users dot sourceforge.net
  2014-12-24  1:37 ` thiago at kde dot org
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: mw_triad at users dot sourceforge.net @ 2014-12-23 23:37 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Matthew Woehlke <mw_triad at users dot sourceforge.net> ---
(In reply to Jonathan Wakely from comment #1)
> PR 58876

*Almost*, except I am proposing that -Wnon-virtual-dtor should trip even if X
does not otherwise have virtual methods. (Just why you'd be writing such code,
I'm not sure, but...)

Odd that didn't turn up in my search for existing bugs...


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

* [Bug libstdc++/64399] g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor
  2014-12-23 22:58 [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor mw_triad at users dot sourceforge.net
  2014-12-23 23:33 ` [Bug libstdc++/64399] " redi at gcc dot gnu.org
  2014-12-23 23:37 ` mw_triad at users dot sourceforge.net
@ 2014-12-24  1:37 ` thiago at kde dot org
  2014-12-24  8:59 ` redi at gcc dot gnu.org
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: thiago at kde dot org @ 2014-12-24  1:37 UTC (permalink / raw)
  To: gcc-bugs

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

Thiago Macieira <thiago at kde dot org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |thiago at kde dot org

--- Comment #3 from Thiago Macieira <thiago at kde dot org> ---
Because it's not a bug.

This is a totally valid scenario.


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

* [Bug libstdc++/64399] g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor
  2014-12-23 22:58 [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor mw_triad at users dot sourceforge.net
                   ` (2 preceding siblings ...)
  2014-12-24  1:37 ` thiago at kde dot org
@ 2014-12-24  8:59 ` redi at gcc dot gnu.org
  2014-12-24  9:01 ` redi at gcc dot gnu.org
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: redi at gcc dot gnu.org @ 2014-12-24  8:59 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
It might be valid with a custom deleter, but the example shown has undefined
behaviour.


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

* [Bug libstdc++/64399] g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor
  2014-12-23 22:58 [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor mw_triad at users dot sourceforge.net
                   ` (3 preceding siblings ...)
  2014-12-24  8:59 ` redi at gcc dot gnu.org
@ 2014-12-24  9:01 ` redi at gcc dot gnu.org
  2014-12-24 10:36 ` glisse at gcc dot gnu.org
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: redi at gcc dot gnu.org @ 2014-12-24  9:01 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
N.B. we definitely want -Wdelete-non-virtual-dtor not the less useful
-Wnon-virtual-dtor


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

* [Bug libstdc++/64399] g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor
  2014-12-23 22:58 [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor mw_triad at users dot sourceforge.net
                   ` (4 preceding siblings ...)
  2014-12-24  9:01 ` redi at gcc dot gnu.org
@ 2014-12-24 10:36 ` glisse at gcc dot gnu.org
  2014-12-24 16:59 ` mw_triad at users dot sourceforge.net
  2021-08-31 18:20 ` redi at gcc dot gnu.org
  7 siblings, 0 replies; 9+ messages in thread
From: glisse at gcc dot gnu.org @ 2014-12-24 10:36 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #6 from Marc Glisse <glisse at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #4)
> It might be valid with a custom deleter, but the example shown has undefined
> behaviour.

When the derived class does not add any member or redefine any important
functionality, it is not an uncommon technique to call the base class
destructor on a derived class. It might pedantically be illegal, but it is
useful, and I believe some people would like to avoid the warning when the two
destructors are equivalent.


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

* [Bug libstdc++/64399] g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor
  2014-12-23 22:58 [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor mw_triad at users dot sourceforge.net
                   ` (5 preceding siblings ...)
  2014-12-24 10:36 ` glisse at gcc dot gnu.org
@ 2014-12-24 16:59 ` mw_triad at users dot sourceforge.net
  2021-08-31 18:20 ` redi at gcc dot gnu.org
  7 siblings, 0 replies; 9+ messages in thread
From: mw_triad at users dot sourceforge.net @ 2014-12-24 16:59 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #7 from Matthew Woehlke <mw_triad at users dot sourceforge.net> ---
(In reply to Thiago Macieira from comment #3)
> Because it's not a bug.
> 
> This is a totally valid scenario.

Valid in what way? I constructed a Y but arranged, probably by accident, that
its dtor is never called. I fail to see how that's not likely a bug in my code
that reasonably warrants a diagnostic. (Note that I'm talking about a
*warning*, and possibly one that isn't even on by default, not an error.)

(In reply to Marc Glisse from comment #6)
> It might pedantically be illegal, but it is useful, and I believe some people
> would like to avoid the warning when the two destructors are equivalent.

However, the compiler doesn't know that here, because I didn't provided a
definition thereof; Y's dtor, even in this example, could have important side
effects. Even if the compiler *can* prove equivalence, I'd be suspicious
whether this was intended, but I'd be okay with a different (i.e. more
pedantic) warning in that case. (I'd also point out that it's not unreasonable
to require the user to somehow annotate if this is intentional if they care
about avoiding the warning when it's enabled.)

Anyway, I still get no warning if Y has members that need to be destroyed,
which definitely causes bad behavior when its dtor isn't called.


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

* [Bug libstdc++/64399] g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor
  2014-12-23 22:58 [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor mw_triad at users dot sourceforge.net
                   ` (6 preceding siblings ...)
  2014-12-24 16:59 ` mw_triad at users dot sourceforge.net
@ 2021-08-31 18:20 ` redi at gcc dot gnu.org
  7 siblings, 0 replies; 9+ messages in thread
From: redi at gcc dot gnu.org @ 2021-08-31 18:20 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2021-08-31
     Ever confirmed|0                           |1

--- Comment #8 from Jonathan Wakely <redi at gcc dot gnu.org> ---
See https://wg21.link/p2413 which proposes to make this conversion ill-formed.

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

end of thread, other threads:[~2021-08-31 18:20 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-23 22:58 [Bug libstdc++/64399] New: g++ does not diagnose when upcasting owning pointer (e.g. unique_ptr) with non-virtual destructor mw_triad at users dot sourceforge.net
2014-12-23 23:33 ` [Bug libstdc++/64399] " redi at gcc dot gnu.org
2014-12-23 23:37 ` mw_triad at users dot sourceforge.net
2014-12-24  1:37 ` thiago at kde dot org
2014-12-24  8:59 ` redi at gcc dot gnu.org
2014-12-24  9:01 ` redi at gcc dot gnu.org
2014-12-24 10:36 ` glisse at gcc dot gnu.org
2014-12-24 16:59 ` mw_triad at users dot sourceforge.net
2021-08-31 18:20 ` 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).