In message: <[EMAIL PROTECTED]> Carlo Marcelo Arenas Belon <[EMAIL PROTECTED]> writes: : On Sun, Nov 11, 2007 at 10:06:34AM -0600, Carlo Marcelo Arenas Belon wrote: : > On Sun, Nov 11, 2007 at 09:30:26AM -0500, Ben Taylor wrote: : > > So the macro turns the last _INTC_ARRAY(NULL) into : > > : > > "NULL, sizeof(NULL)/sizeof(*NULL) : > : > in my 64bit linux using gcc-4.1.2 it becomes instead : : > : > ((void *)0), sizeof(((void *)0))/sizeof(*((void *)0)) : > : > what version of gcc (gcc -v) are you using in that Solaris 10 box? (HINT: not : > all available versions of gcc compile qemu correctly) : : > : > http://www.opensolaris.org/os/project/qemu/host/gcc-failures/ : : That didn't sound as clear as it should, so I booted an OpenSolaris Nevada 70b : using the sun provided gcc : : : $ uname -a : SunOS dell 5.11 snv_70b i86pc i386 i86pc : $ gcc -v : Reading specs from /usr/sfw/lib/gcc/i386-pc-solaris2.11/3.4.3/specs : Configured with: /builds2/sfwnv-gate/usr/src/cmd/gcc/gcc-3.4.3/configure : --prefix=/usr/sfw --with-as=/usr/sfw/bin/gas --with-gnu-as : --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++,f77,objc : --enable-shared : Thread model: posix : gcc version 3.4.3 (csl-sol210-3_4-20050802) : : and run a test, the problem is in /usr/include/iso/stdio_iso.h that defined : NULL as an int and not a pointer as shown by : : : fndef NULL : #if defined(_LP64) : #define NULL 0L : #else : #define NULL 0 : #endif : #endif : : contradicting (at least in spirit) the C99 (ISO/IEC 9899:TCS) standard that : says : : : "A pointer to void shall have the same representation and alignment : requirements as a pointer to a character type"
NULL isn't a pointer. It is a integral constant, per section 6.3.2.3.3 of C99. So *NULL is undefined. If you want a constant thats an actual pointer, you need to define one special. 6.3.2.3 Pointers ... [#3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. If a null pointer constant is assigned to or compared for equality to a pointer, the constant is converted to a pointer of that type. Such a pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function. [#4] Conversion of a null pointer to another pointer type yields a null pointer of that type. Any two null pointers shall compare equal. 7.17 Common definitions <stddef.h> ... [#3] The macros are NULL which expands to an implementation-defined null pointer constant; and .. The root cause is of this whole problem is *NULL, an undefined, unportable construct. That's what should be fixed, not the definition of NULL if you want this code to be portable. Warner