public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/67315] New: Strange 'this' pointer behavior when calling virtual function with different optimization attributes.
@ 2015-08-21 23:28 waseemsarwar103 at yahoo dot com
  2015-08-22  8:46 ` [Bug c++/67315] " redi at gcc dot gnu.org
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: waseemsarwar103 at yahoo dot com @ 2015-08-21 23:28 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 67315
           Summary: Strange 'this' pointer behavior when calling virtual
                    function with different optimization attributes.
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: critical
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: waseemsarwar103 at yahoo dot com
  Target Milestone: ---

Created attachment 36238
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36238&action=edit
preprocessed file of the code in bug

The issue below only get produced on x86 (32 bit) system.

Compiler Version: gcc 4.9.0 (Target: i686-pc-linux-gnu)

System Type:  ubuntu 14.04.02
(Linux dev-virtual-machine 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15
17:45:15 UTC 2015 i686 i686 i686 GNU/Linux)

GCC Compilation Options: 
Configured with: ../gcc-4.9.0/configure --prefix=/home/was/gcc/gcc_install/
--with-gmp=/home/was/gcc/gcc_install/gcc_pre/
--with-mpfr=/home/was/gcc/gcc_install/gcc_pre/ --enable-shared
--with-system-zlib --enable-threads=posix
--with-mpc='/home/was/gcc/gcc_install/gcc_pre/1~'

Compilation command: 
g++- -ggdb -O3 -Wall -Werror -fstrict-aliasing -Wstrict-aliasing=2 -Wcast-align
-fPIC -fno-exceptions -fno-rtti -funsigned-char -DNOTLS -D__STDC_LIMIT_MACROS
-D__STDC_FORMAT_MACROS  -o incorrect_this.o test_incorrect_this.cpp

Comiler Output: Clean compilation. No error or warnings.

Description:
When following code is compiled with '-O3' but certain functions in the derived
class uses specific function attribute '(__attribute__((optimize("O0"))))' to
not apply global optimization to those functions, then calling the virtual
function from within those function causes 'this' pointer to be garbage and is
way off than the actual 'this' pointer.

If I compile the whole code with 'O0', the problem goes away. It seems like the
compiler is producing incompatible code when the function has optimization
level of 'O0' and calling a virtual function that was compiled with "O3". 

I have the following code that reproduces the problem with compiler version gcc
4.9.0, 4.9.2 and 4.9.3 on x86 systems. Observe 'this' pointer behavior in
virtual functions calls. 

Code: 
#include <stdio.h>

class ITest1
{
public:
        virtual void test11(void) = 0;
};

class ITest2
{
public:
        virtual void test21(void)
        {
                printf("Calling test21 %p\n", this);
        }
};

#define OPTIMIZE_SIZE __attribute__((optimize("O0")))

class Test : public ITest1, public ITest2
{
public:
        Test() : m_test(0)
        { }

        OPTIMIZE_SIZE void init()
        {
                m_test = 4;
                printf("Init %p \n", this);
                printf("m_test = %d\n", m_test);

                // All following functions have strange 'this' pointer value.
                test11();
                test21();
        }


        void test11(void)
        {
                printf("Calling test11 %p\n", this);
                //printf("m_test = %d \n", m_test);
        }

        void test12(void)
        {
                printf("Calling test12 %p\n", this);
        }


private:
        int m_test;
};

int main()
{
        Test *test = new Test();
        test->init();
}

Output:

root@dev-virtual-machine:/home/dev/framework/test_incorrect_this#
./incorrect_this.o
Init 0x96d9a10
m_test = 4
Calling test11 0xc
Calling test21 0xc

Observe that this pointer has changed to completely different value pointing to
garbage. 

Please help me understand the problem and potential fix to avoid this kind of
scenario. Thanks.


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

end of thread, other threads:[~2015-08-25  8:58 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-21 23:28 [Bug c++/67315] New: Strange 'this' pointer behavior when calling virtual function with different optimization attributes waseemsarwar103 at yahoo dot com
2015-08-22  8:46 ` [Bug c++/67315] " redi at gcc dot gnu.org
2015-08-22  8:57 ` [Bug c++/67315] [4.9 Regression] " redi at gcc dot gnu.org
2015-08-25  8:25 ` rguenth at gcc dot gnu.org
2015-08-25  8:26 ` rguenth at gcc dot gnu.org
2015-08-25  8:58 ` 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).