test.c --------------------------------- #include <string.h> #include <malloc.h> int main() { char *s = strdup( "foo" ); free( s ); return 0; } compile in/out ------------------------- $ gcc -Wall -ansi test.c test.c: In function ‘main’: test.c:6: warning: implicit declaration of function ‘strdup’ test.c:6: warning: initialization makes pointer from integer without a cast gcc -v --------------------------------- Using built-in specs. Target: i386-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=i386-redhat-linux Thread model: posix gcc version 4.0.2 20051125 (Red Hat 4.0.2-8) test.i --------------------------------- # 1 "test.c" # 1 "<built-in>" # 1 "<command line>" # 1 "test.c" # 1 "/usr/include/string.h" 1 3 4 # 26 "/usr/include/string.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 314 "/usr/include/features.h" 3 4 # 1 "/usr/include/sys/cdefs.h" 1 3 4 # 315 "/usr/include/features.h" 2 3 4 # 337 "/usr/include/features.h" 3 4 # 1 "/usr/include/gnu/stubs.h" 1 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 5 "/usr/include/gnu/stubs.h" 2 3 4 # 1 "/usr/include/gnu/stubs-32.h" 1 3 4 # 8 "/usr/include/gnu/stubs.h" 2 3 4 # 338 "/usr/include/features.h" 2 3 4 # 27 "/usr/include/string.h" 2 3 4 # 1 "/usr/lib/gcc/i386-redhat-linux/4.0.2/include/stddef.h" 1 3 4 # 214 "/usr/lib/gcc/i386-redhat-linux/4.0.2/include/stddef.h" 3 4 typedef unsigned int size_t; # 34 "/usr/include/string.h" 2 3 4 extern void *memcpy (void *__restrict __dest, __const void *__restrict __src, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); extern void *memmove (void *__dest, __const void *__src, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); # 57 "/usr/include/string.h" 3 4 extern void *memset (void *__s, int __c, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); extern int memcmp (__const void *__s1, __const void *__s2, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); extern void *memchr (__const void *__s, int __c, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); # 82 "/usr/include/string.h" 3 4 extern char *strcpy (char *__restrict __dest, __const char *__restrict __src) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); extern char *strncpy (char *__restrict __dest, __const char *__restrict __src, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); extern char *strcat (char *__restrict __dest, __const char *__restrict __src) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); extern char *strncat (char *__restrict __dest, __const char *__restrict __src, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1, 2))); extern int strcmp (__const char *__s1, __const char *__s2) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); extern int strncmp (__const char *__s1, __const char *__s2, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); extern int strcoll (__const char *__s1, __const char *__s2) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); extern size_t strxfrm (char *__restrict __dest, __const char *__restrict __src, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2))); # 165 "/usr/include/string.h" 3 4 extern char *strchr (__const char *__s, int __c) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); extern char *strrchr (__const char *__s, int __c) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); # 181 "/usr/include/string.h" 3 4 extern size_t strcspn (__const char *__s, __const char *__reject) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); extern size_t strspn (__const char *__s, __const char *__accept) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); extern char *strpbrk (__const char *__s, __const char *__accept) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); extern char *strstr (__const char *__haystack, __const char *__needle) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2))); extern char *strtok (char *__restrict __s, __const char *__restrict __delim) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2))); extern char *__strtok_r (char *__restrict __s, __const char *__restrict __delim, char **__restrict __save_ptr) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2, 3))); # 240 "/usr/include/string.h" 3 4 extern size_t strlen (__const char *__s) __attribute__ ((__nothrow__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1))); # 254 "/usr/include/string.h" 3 4 extern char *strerror (int __errnum) __attribute__ ((__nothrow__)); # 288 "/usr/include/string.h" 3 4 extern void __bzero (void *__s, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))); # 426 "/usr/include/string.h" 3 4 # 2 "test.c" 2 # 1 "/usr/include/malloc.h" 1 3 4 # 24 "/usr/include/malloc.h" 3 4 # 1 "/usr/lib/gcc/i386-redhat-linux/4.0.2/include/stddef.h" 1 3 4 # 152 "/usr/lib/gcc/i386-redhat-linux/4.0.2/include/stddef.h" 3 4 typedef int ptrdiff_t; # 326 "/usr/lib/gcc/i386-redhat-linux/4.0.2/include/stddef.h" 3 4 typedef long int wchar_t; # 25 "/usr/include/malloc.h" 2 3 4 # 46 "/usr/include/malloc.h" 3 4 extern void *malloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) ; extern void *calloc (size_t __nmemb, size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) ; extern void *realloc (void *__ptr, size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) __attribute__ ((__warn_unused_result__)); extern void free (void *__ptr) __attribute__ ((__nothrow__)); extern void cfree (void *__ptr) __attribute__ ((__nothrow__)); extern void *memalign (size_t __alignment, size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) ; extern void *valloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) ; extern void * pvalloc (size_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)) ; extern void *(*__morecore) (ptrdiff_t __size); extern void *__default_morecore (ptrdiff_t __size) __attribute__ ((__nothrow__)) __attribute__ ((__malloc__)); struct mallinfo { int arena; int ordblks; int smblks; int hblks; int hblkhd; int usmblks; int fsmblks; int uordblks; int fordblks; int keepcost; }; extern struct mallinfo mallinfo (void) __attribute__ ((__nothrow__)); # 128 "/usr/include/malloc.h" 3 4 extern int mallopt (int __param, int __val) __attribute__ ((__nothrow__)); extern int malloc_trim (size_t __pad) __attribute__ ((__nothrow__)); extern size_t malloc_usable_size (void *__ptr) __attribute__ ((__nothrow__)); extern void malloc_stats (void) __attribute__ ((__nothrow__)); extern void *malloc_get_state (void) __attribute__ ((__nothrow__)); extern int malloc_set_state (void *__ptr) __attribute__ ((__nothrow__)); extern void (*__malloc_initialize_hook) (void); extern void (*__free_hook) (void *__ptr, __const void *); extern void *(*__malloc_hook) (size_t __size, __const void *); extern void *(*__realloc_hook) (void *__ptr, size_t __size, __const void *); extern void *(*__memalign_hook) (size_t __alignment, size_t __size, __const void *); extern void (*__after_morecore_hook) (void); extern void __malloc_check_init (void) __attribute__ ((__nothrow__)); # 3 "test.c" 2 int main() { char *s = strdup( "foo" ); free( s ); return 0; }
This is not a GCC bug, strdup is not ISO C. What is happening is that GCC is defining STRICT_ANSI and glibc says then you cannot use another thing besides ISO C headers which means no strdup.
Ok, either use -D_GNU_SOURCE or don't use -ansi. Use -pedantic-errors instead of -ansi.
Subject: Re: strdup "implicit declaration" warning when using -ansi I see. Sorry for a needless bug report. But thank you for your helpful responses. I expect I really will need to use -ansi (--> STRICT_ANSI), so I'll have to do without strdup. Joshua Shinavier On 20 Feb 2006 20:07:13 -0000, pinskia at gcc dot gnu dot org <gcc-bugzilla@gcc.gnu.org> wrote: > > > ------- Comment #2 from pinskia at gcc dot gnu dot org 2006-02-20 20:07 ------- > Ok, either use -D_GNU_SOURCE or don't use -ansi. Use -pedantic-errors instead > of -ansi. > > > -- > > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26386 > > ------- You are receiving this mail because: ------- > You reported the bug, or are watching the reporter. >