Hello,

I think I have found a bug in G++ . Please submit it to the bug tracker (I do not want to open an account there) if you think it is a bug - I am not sure about it.

While I worked with "search+replace" I accidently had following in my source code:

const char* DUMMY = DUMMY;

It is amaazing that this code actually does compile. And no warning is output at all.

The usage of this mysterious constant "DUMMY" causes odd behavior, e.g. if it is written to a stream, the stream becomes "broken" and nothing can be written to it anymore:

cout << "Hello world" << endl;
cout << DUMMY;
cout << "You cannot read this. I am broken..." << endl;

I also had in mind that the program might have been crashed/terminated, but in fact, it is still running. I verified it with a printf() at the end and it showed me that the program is still running and just the 'cout' stream is gone.

Here are some small reproduceable codes:

1. broken.c:
============

#include <stdio.h>
#include <iostream>
int main(void) {
        const char* DUMMY = DUMMY;
        std::cout << DUMMY;
        return 0;
}

working.c:
============

#include <stdio.h>
#include <iostream>
int main(void) {
        const char* DUMMY = "x";
        std::cout << DUMMY;
        return 0;
}

The diff result of broken.asm and working.asm is:
=====================================================

--- broken.asm  2012-04-29 08:41:25.000000000 +0200
+++ working.asm 2012-04-29 08:41:26.000000000 +0200
@@ -1 +1 @@
-       .file   "broken.c"
+       .file   "working.c"
@@ -3,0 +4,3 @@
+       .section        .rodata
+.LC0:
+       .string "x"
@@ -16,0 +20 @@
+       movq    $.LC0, -8(%rbp)

A part of working.asm:
======================

.LC0:
        .string "x"
        .text
main:
.LFB957:
        .cfi_startproc
        .cfi_personality 0x3,__gxx_personality_v0
        pushq   %rbp
        .cfi_def_cfa_offset 16
        movq    %rsp, %rbp
        .cfi_offset 6, -16
        .cfi_def_cfa_register 6
        subq    $16, %rsp
movq $.LC0, -8(%rbp) // <----- this is missing at broken.asm!
        movq    -8(%rbp), %rax
        movq    %rax, %rsi
        movl    $_ZSt4cout, %edi
        call    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
        movl    $0, %eax
        leave
        ret
        .cfi_endproc

A part of broken.asm:
======================

main:
.LFB957:
        .cfi_startproc
        .cfi_personality 0x3,__gxx_personality_v0
        pushq   %rbp
        .cfi_def_cfa_offset 16
        movq    %rsp, %rbp
        .cfi_offset 6, -16
        .cfi_def_cfa_register 6
        subq    $16, %rsp
        movq    -8(%rbp), %rax
        movq    %rax, %rsi
        movl    $_ZSt4cout, %edi
        call    _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
        movl    $0, %eax
        leave
        ret
        .cfi_endproc

My 'g++ -v' output:
====================

Es werden eingebaute Spezifikationen verwendet.
Ziel: x86_64-linux-gnu
Konfiguriert mit: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread-Modell: posix
gcc-Version 4.4.5 (Debian 4.4.5-8)

(Note: It is the latest version I can get. Since it is a production system I cannot install newer unstable versions and I do not have a Linux box at home.)

Best regards
Daniel Marschall

Reply via email to