/*
when using an external function pointer cast as an interrupt in a if (&function
== 0) statement the compiler assume the pointer is non-null and optimize out
the if right away even tho the symbol could indeed be null and optimizations
are disabled.

this is a big problem when values are set as symbol addresses in the linker
script.

gcc and g++ give the same result
.cpp and .c extentions give the same result
all targets I've tested (i386, arm, powerpc) give the same result

Linux shockenhull 2.6.16.13-4-smp #1 SMP Wed May 3 04:53:23 UTC 2006 i686
athlon i386 GNU/Linux

GCC versions I tried:
i686-pc-linux-gnu-gcc (GCC) 4.1.2
gcc (GCC) 4.1.0 (SUSE Linux)
arm-unknown-elf-gcc (GCC) 4.1.1
ppc-unknown-elf-gcc (GCC) 4.1.1
i386-unknown-elf-gcc (GCC) 4.1.1
*/
//------------if-bug-function-pointers.cpp-----------

extern void SomeLinkerScriptDefinedSymbol(void);

#define SOMEVALUE ((int)&SomeLinkerScriptDefinedSymbol)

int main()
{
#ifdef USETEMP
        // this works fine
        int i = SOMEVALUE;
        if(i == 0){
                return 0;
        } else {
                return -1;
        }
#else
        // this incorrectly assumes SOMEVALUE != 0
        if(SOMEVALUE == 0){
                return 0;
        } else {
                return -1;
        }
#endif
}

//----------------------------------------
/*
[EMAIL PROTECTED]:~/tmp> i686-pc-linux-gnu-gcc -v -save-temps -O0 -c
if-bug-function-pointers.c -o if-bug-function-pointers.o
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=/home/shockenhull/bin/gcc-4.1.2
Thread model: posix
gcc version 4.1.2
 /home/shockenhull/bin/gcc-4.1.2/libexec/gcc/i686-pc-linux-gnu/4.1.2/cc1 -E
-quiet -v if-bug-function-pointers.c -mtune=pentiumpro -O0 -fpch-preprocess -o
if-bug-function-pointers.i
ignoring nonexistent directory
"/home/shockenhull/bin/gcc-4.1.2/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /home/shockenhull/bin/gcc-4.1.2/include
 /home/shockenhull/bin/gcc-4.1.2/lib/gcc/i686-pc-linux-gnu/4.1.2/include
 /usr/include
End of search list.
 /home/shockenhull/bin/gcc-4.1.2/libexec/gcc/i686-pc-linux-gnu/4.1.2/cc1
-fpreprocessed if-bug-function-pointers.i -quiet -dumpbase
if-bug-function-pointers.c -mtune=pentiumpro -auxbase-strip
if-bug-function-pointers.o -O0 -version -o if-bug-function-pointers.s
GNU C version 4.1.2 (i686-pc-linux-gnu)
        compiled by GNU C version 4.1.0 (SUSE Linux).
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: ee7023030d57847fe562209522d89579
 as -V -Qy -o if-bug-function-pointers.o if-bug-function-pointers.s
GNU assembler version 2.16.91.0.5 (i586-suse-linux) using BFD version
2.16.91.0.5 20051219 (SUSE Linux)
[EMAIL PROTECTED]:~/tmp>      
----------------------------------------
*/


-- 
           Summary: incorrect output on external symbol address cast as
                    integer used in conditional statement
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: sh-list at ssc-studios dot com
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: any


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31236

Reply via email to