[cfe-dev] -Wglobal-constructors vs static initialization

Eli Friedman eli.friedman at gmail.com
Mon Dec 5 13:27:09 PST 2011


On Mon, Dec 5, 2011 at 1:15 PM, Nico Weber <thakis at chromium.org> wrote:
> Hi,
>
> -Wglobal-constructors looks like a very useful warning for finding
> static initializers. However, it looks like it warns in several cases
> where clang is smart enough to not emit a static initializer (but gcc
> isn't, at least the versions I'm using):
>
> $ cat test.cc
> #include <limits>
>
> class A {
>  public:
>  A(int n) : a_(n) {}
>  int a_;
> };
>
> int g_n = std::numeric_limits<int>::max();
> A g_a(5);  // gcc 4.2 gets this right, 4.4 doesn't
>
> int main() {
>  return g_a.a_ + g_n;
> }
> #include <string.h>
> int f(char* f) {
>  return strlen(f) == 0;
> }
> $ g++ -o foo test.cc -O2
> $ otool -l foo | grep -C 5 __mod_init_func  | grep size
>      size 0x0000000000000008
> $ third_party/llvm-build/Release+Asserts/bin/clang++ -o foo test.cc -O2
> $ otool -l foo | grep -C 5 __mod_init_func  | grep size
> # Note: No output.
>
>
> But:
>
> $ third_party/llvm-build/Release+Asserts/bin/clang++ -o foo test.cc
> -O2 -Wglobal-constructors
> test.cc:9:5: warning: declaration requires a global constructor
> [-Wglobal-constructors]
> int g_n = std::numeric_limits<int>::max();
>    ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> test.cc:10:3: warning: declaration requires a global constructor
> [-Wglobal-constructors]
> A g_a(5);
>  ^~~~~~
> 2 warnings generated.
>
>
> Is this intentional, or should -Wglobal-constructors be changed to
> only warn about constructors that do create static initializers at
> -O2?

This is mostly intentional; we don't want this warning to randomly
appear/disappear if we change the optimizer.  (With C++11, appropriate
constexpr markings will suppress this warning in the given cases.)

-Eli




More information about the cfe-dev mailing list