[cfe-dev] -Wglobal-constructors warns on constexpr default constructor evaluated at compile-time?

Friedman, Eli via cfe-dev cfe-dev at lists.llvm.org
Tue Jan 16 12:12:59 PST 2018


On 1/16/2018 11:26 AM, Gabriel Charette wrote:
>
>
> On Tue, Jan 16, 2018 at 8:00 PM Richard Smith <richard at metafoo.co.uk 
> <mailto:richard at metafoo.co.uk>> wrote:
>
>     On 16 January 2018 at 10:43, Friedman, Eli via cfe-dev
>     <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>
>         On 1/16/2018 4:14 AM, Gabriel Charette via cfe-dev wrote:
>
>             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()).
>
>         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.
>
>
>     Well, there are (at least) four distinct problems here:
>
>      1) Code running at process startup (a performance problem)
>      2) Code running at process termination (a performance problem)
>      3) Global variables with non-constant initialization resulting in
>     buggy program startup (called the "initialization order fiasco" by
>     some)
>      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)
>
>     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.)
>
>
> Yes, precisely.
>
> 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.
>
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.)

On a side-note, it would be nice if the following worked to suppress 
global destructors:

struct A { ~A(); };
template<typename T> union NoDestroy {
   T t;
   constexpr NoDestroy():t{} {}
   constexpr ~NoDestroy() {}
};
NoDestroy<A> x;

-Eli

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180116/986dd4fb/attachment.html>


More information about the cfe-dev mailing list