[cfe-dev] Bug with -fvisibility-inlines-hidden flag
Weitian Leung via cfe-dev
cfe-dev at lists.llvm.org
Wed Oct 14 02:07:19 PDT 2015
Hi all,
Consider the following code (full source code can be found in attachment)
object.h
> #define _DESTRUCTOR_IN_HEADER
>
> class Object
> {
> public:
> Object();
> #ifdef _DESTRUCTOR_IN_HEADER
> ~Object()
> {
> }
> #else
> ~Object();
> #endif
>
> private:
> class Counter
> {
> public:
> Counter()
> : _count(0)
> {
> printf("Counter: %p %d\n", this, _count);
> }
>
> ~Counter()
> {
> printf("~Counter: %p %d\n", this, _count);
> }
>
> void operator++() { ++_count; }
> void operator--() { --_count; }
>
> private:
> int _count;
> };
>
> class Foo
> {
> public:
> Foo() { ++counter(); }
> ~Foo() { --counter(); }
>
> private:
> Counter& counter()
> {
> static Counter s_counter;
> return s_counter;
> }
> } foo;
> };
object.cpp
> #include "object.h"
>
> Object::Object()
> {
> }
>
> #ifndef _DESTRUCTOR_IN_HEADER
> Object::~Object()
> {
>
> }
> #endif
Build the source to a shared library (compile with
-fvisibility-inlines-hidden flag),
uses in main (another module)
> Object *obj = new Object;
> delete obj;
you may see the strange output when running
> Counter: 0x7f2ded933efc 0
> Counter: 0x6012d4 0
> ~Counter: 0x6012d4 -1
> ~Counter: 0x7f2ded933efc 1
The Counter construct/destruct twice, the second one (Counter: 0x6012d4
0) construct from
delete obj > Object::Foo::~Foo() > Object::Foo::counter()
when comment out the line *#define _DESTRUCTOR_IN_HEADER *or remove the*
**-fvisibility-inlines-hidden* flag, it works as expected
remove the compile flag
> Counter: 0x6013a4 0
> ~Counter: 0x6013a4 0
comment out #define _DESTRUCTOR_IN_HEADER
> Counter: 0x7f1eaa16629c 0
> ~Counter: 0x7f1eaa16629c 0
A bit difference, as the address isn't the same (heap and stack)
this code works with GCC (as least 5.2 as my test) with or without the
-fvisibility-inlines-hidden
flag, of course it works with MSVC too.
I don't known is this a bug with the flag or because the silly code
makes it (as when constructor and
destructor defined in the same file, it works).
--
/Regards/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20151014/0365dbc0/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: demo.tar.xz
Type: application/x-xz
Size: 832 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20151014/0365dbc0/attachment.bin>
More information about the cfe-dev
mailing list