<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">On 1/16/2018 11:26 AM, Gabriel Charette
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAJTZ7LLJRBweBuWSCP66qgYjc0ZmzFGSHyQkb-AHFUctw5P_SQ@mail.gmail.com">
<div dir="ltr"><br>
<br>
<div class="gmail_quote">
<div dir="ltr">On Tue, Jan 16, 2018 at 8:00 PM Richard Smith
<<a href="mailto:richard@metafoo.co.uk"
moz-do-not-send="true">richard@metafoo.co.uk</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">On 16 January 2018 at 10:43,
Friedman, Eli via cfe-dev <span dir="ltr"><<a
href="mailto:cfe-dev@lists.llvm.org"
target="_blank" class="cremed"
moz-do-not-send="true">cfe-dev@lists.llvm.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px
0px 0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex"><span
class="m_-3430430873447914162gmail-">On 1/16/2018
4:14 AM, Gabriel Charette via cfe-dev wrote:<br>
<blockquote class="gmail_quote" style="margin:0px
0px 0px 0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
I would indeed expect, like Primiano, that
-Wglobal-constructors would only warn about
*con*structors (one can decide to mitigate
global *de*structors another way, e.g. by
invoking _exit() before end of main()).<br>
</blockquote>
</span>
The point of -Wglobal-constructors is to avoid code
which runs at process startup. Due to the way the
C++ ABI works, a global destructor involves emitting
a call to __cxa_atexit which runs at startup, so we
warn.<br>
</blockquote>
<div><br>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div>Well, there are (at least) four distinct problems
here:</div>
<div><br>
</div>
<div> 1) Code running at process startup (a
performance problem)</div>
<div> 2) Code running at process termination (a
performance problem)</div>
<div> 3) Global variables with non-constant
initialization resulting in buggy program startup
(called the "initialization order fiasco" by some)</div>
<div> 4) Global variables with non-trivial destruction
resulting in buggy program shutdown, particularly in
multithreaded code (if you have non-trivial global
dtors, multiple threads, and you call exit, you
typically have a bug)</div>
<div><br>
</div>
<div>It makes sense to request warnings about #3
without requesting the more general warnings about
#1; as such, ignoring destructors in the
-Wglobal-constructors warning would seem reasonable
to me. (That allows all four problems to be detected
by some combination of the two warning flags.)</div>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>Yes, precisely.</div>
<div><br>
</div>
<div>A program can decide to mitigate against 2/4 by
atomically exiting with _exit() before the end of main() and
hence truly only want to be warned by 1/3.</div>
<div><br>
</div>
</div>
</div>
</blockquote>
<p>I'm not sure (3) is a problem this warning solves well; there are
a lot of classes with constructors which aren't constexpr, but
don't have relevant side-effects (for example, std::vector). But
I guess we could introduce a new warning flag. (We probably don't
want to change the meaning of the current warning flag for the
sake of compatibility with existing build systems.)<br>
</p>
<p>On a side-note, it would be nice if the following worked to
suppress global destructors:<br>
</p>
<p>struct A { ~A(); };<br>
template<typename T> union NoDestroy {<br>
T t;<br>
constexpr NoDestroy():t{} {}<br>
constexpr ~NoDestroy() {}<br>
};<br>
NoDestroy<A> x;<br>
</p>
<p>-Eli<br>
</p>
<pre class="moz-signature" cols="72">--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project</pre>
</body>
</html>