http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60934
Bug ID: 60934 Summary: Strtoll Function Always Appears to Return 0 on Solaris Product: gcc Version: 4.8.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: william.speak at sophos dot com This bug seems to happen when two variables of `long long` and `double` are declared in a function with the same name. A minimalistic example: // bug.c #include <stdio.h> #include <stdlib.h> int main(int argc, const char* argv[]) { char* value = "12345"; char* end = NULL; double bug; { long long bug = 6789; bug = strtoll(value, &end, 10); printf("%ld\n", bug); } return 0; } Compiling with `gcc bug.c -o bug` and running with `./bug` produces the follwing output: $ ./bug 0 The expected output would be `12345`. Changing the type of the inner `bug` to `long` or renaming it fixes the issue and `12345` is printed. Running `gcc --version`: gcc (GCC) 4.8.2 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Running `gcc -v`: Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/opt/toolchain/libexec/gcc/sparc-sun-solaris2.9/4.8.2/lto-wrapper Target: sparc-sun-solaris2.9 Configured with: ../gcc-4.8.2/configure --prefix=/opt/toolchain --with-gmp=/opt/toolchain --with-mpfr=/opt/toolchain --with-mpc=/opt/toolchain --with-gnu-as --with-as=/opt/toolchain/bin/as --without-gnu-ld --with-ld=/usr/ccs/bin/ld --enable-languages=c,c++ --disable-lto Thread model: posix gcc version 4.8.2 (GCC) Running `gcc bug.c -S` produces the following assembly .file "bug.c" .section ".rodata" .align 8 .LLC0: .asciz "12345" .align 8 .LLC1: .asciz "%ld\n" .section ".text" .align 4 .global main .type main, #function .proc 04 main: save %sp, -120, %sp st %i0, [%fp+68] st %i1, [%fp+72] sethi %hi(.LLC0), %g1 or %g1, %lo(.LLC0), %g1 st %g1, [%fp-4] st %g0, [%fp-20] mov 0, %g2 sethi %hi(6144), %g3 or %g3, 645, %g3 std %g2, [%fp-16] add %fp, -20, %g1 ld [%fp-4], %o0 mov %g1, %o1 mov 10, %o2 call strtoll, 0 nop std %o0, [%fp-16] sethi %hi(.LLC1), %g1 or %g1, %lo(.LLC1), %o0 ld [%fp-16], %o1 ld [%fp-12], %o2 call printf, 0 nop mov 0, %g1 mov %g1, %i0 return %i7+8 nop .size main, .-main .ident "GCC: (GNU) 4.8.2" And finally `bug.i`: # 1 "bug.c" # 1 "<command-line>" # 1 "bug.c" # 1 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 1 3 4 # 14 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 # 1 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include/stdarg.h" 1 3 4 # 40 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include/stdarg.h" 3 4 typedef __builtin_va_list __gnuc_va_list; # 15 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 2 3 4 # 34 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 #pragma ident "@(#)stdio.h 1.79 01/04/16 SMI" # 1 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 1 3 4 # 41 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 3 4 #pragma ident "@(#)stdio_iso.h 1.2 99/10/25 SMI" # 1 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/sys/feature_tests.h" 1 3 4 # 22 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/sys/feature_tests.h" 3 4 #pragma ident "@(#)feature_tests.h 1.18 99/07/26 SMI" # 1 "/usr/include/sys/isa_defs.h" 1 3 4 # 9 "/usr/include/sys/isa_defs.h" 3 4 #pragma ident "@(#)isa_defs.h 1.20 99/05/04 SMI" # 25 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/sys/feature_tests.h" 2 3 4 # 45 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 2 3 4 # 1 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/sys/va_list.h" 1 3 4 # 18 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/sys/va_list.h" 3 4 #pragma ident "@(#)va_list.h 1.13 01/02/08 SMI" # 35 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/sys/va_list.h" 3 4 typedef __builtin_va_list __va_list; # 46 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 2 3 4 # 1 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio_tag.h" 1 3 4 # 18 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio_tag.h" 3 4 #pragma ident "@(#)stdio_tag.h 1.3 98/04/20 SMI" # 30 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio_tag.h" 3 4 typedef struct __FILE __FILE; # 47 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 2 3 4 # 1 "/usr/include/stdio_impl.h" 1 3 4 # 9 "/usr/include/stdio_impl.h" 3 4 #pragma ident "@(#)stdio_impl.h 1.13 01/11/16 SMI" # 22 "/usr/include/stdio_impl.h" 3 4 typedef int ssize_t; # 38 "/usr/include/stdio_impl.h" 3 4 struct __FILE { ssize_t _cnt; unsigned char *_ptr; unsigned char *_base; unsigned char _flag; unsigned char _file; unsigned __orientation:2; unsigned __ionolock:1; unsigned __seekable:1; unsigned __filler:4; }; # 48 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 2 3 4 # 68 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 3 4 typedef long long __longlong_t; # 84 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 3 4 typedef __FILE FILE; typedef unsigned int size_t; typedef long fpos_t; # 156 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 3 4 extern __FILE __iob[20]; # 173 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/iso/stdio_iso.h" 3 4 extern int remove(const char *); extern int rename(const char *, const char *); extern FILE *tmpfile(void); extern char *tmpnam(char *); extern int fclose(FILE *); extern int fflush(FILE *); extern FILE *fopen(const char *, const char *); extern FILE *freopen(const char *, const char *, FILE *); extern void setbuf(FILE *, char *); extern int setvbuf(FILE *, char *, int, size_t); extern int fprintf(FILE *, const char *, ...); extern int fscanf(FILE *, const char *, ...); extern int printf(const char *, ...); extern int scanf(const char *, ...); extern int sprintf(char *, const char *, ...); extern int sscanf(const char *, const char *, ...); extern int vfprintf(FILE *, const char *, __va_list); extern int vprintf(const char *, __va_list); extern int vsprintf(char *, const char *, __va_list); extern int fgetc(FILE *); extern char *fgets(char *, int, FILE *); extern int fputc(int, FILE *); extern int fputs(const char *, FILE *); extern int getc(FILE *); extern int putc(int, FILE *); extern int getchar(void); extern int putchar(int); extern char *gets(char *); extern int puts(const char *); extern int ungetc(int, FILE *); extern size_t fread(void *, size_t, size_t, FILE *); extern size_t fwrite(const void *, size_t, size_t, FILE *); extern int fgetpos(FILE *, fpos_t *); extern int fseek(FILE *, long, int); extern int fsetpos(FILE *, const fpos_t *); extern long ftell(FILE *); extern void rewind(FILE *); extern void clearerr(FILE *); extern int feof(FILE *); extern int ferror(FILE *); extern void perror(const char *); extern int __filbuf(FILE *); extern int __flsbuf(int, FILE *); # 37 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 2 3 4 # 109 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 typedef long off_t; typedef __longlong_t off64_t; # 127 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 typedef __longlong_t fpos64_t; # 155 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 extern unsigned char _sibuf[], _sobuf[]; # 197 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 extern unsigned char *_bufendtab[]; extern FILE *_lastbuf; # 233 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 extern void setbuffer(FILE *, char *, size_t); extern int setlinebuf(FILE *); extern int vfscanf(FILE *, const char *, __gnuc_va_list); extern int vscanf(const char *, __gnuc_va_list); extern int vsscanf(const char *, const char *, __gnuc_va_list); extern int snprintf(char *, size_t, const char *, ...); extern int vsnprintf(char *, size_t, const char *, __gnuc_va_list); # 262 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 extern FILE *fdopen(int, const char *); extern char *ctermid(char *); extern int fileno(FILE *); # 288 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 extern FILE *popen(const char *, const char *); extern char *cuserid(char *); extern char *tempnam(const char *, const char *); extern int getopt(int, char *const *, const char *); extern int getsubopt(char **, char *const *, char **); extern char *optarg; extern int optind, opterr, optopt; extern int getw(FILE *); extern int putw(int, FILE *); extern int pclose(FILE *); extern int fseeko(FILE *, off_t, int); extern off_t ftello(FILE *); # 317 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdio.h" 3 4 extern FILE *fopen64(const char *, const char *); extern FILE *freopen64(const char *, const char *, FILE *); extern FILE *tmpfile64(void); extern int fgetpos64(FILE *, fpos64_t *); extern int fsetpos64(FILE *, const fpos64_t *); extern int fseeko64(FILE *, off64_t, int); extern off64_t ftello64(FILE *); # 2 "bug.c" 2 # 1 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdlib.h" 1 3 4 # 25 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdlib.h" 3 4 #pragma ident "@(#)stdlib.h 1.48 00/04/13 SMI" # 1 "/usr/include/iso/stdlib_iso.h" 1 3 4 # 28 "/usr/include/iso/stdlib_iso.h" 3 4 #pragma ident "@(#)stdlib_iso.h 1.3 01/03/09 SMI" # 37 "/usr/include/iso/stdlib_iso.h" 3 4 extern unsigned char __ctype[]; # 48 "/usr/include/iso/stdlib_iso.h" 3 4 typedef struct { int quot; int rem; } div_t; typedef struct { long quot; long rem; } ldiv_t; # 84 "/usr/include/iso/stdlib_iso.h" 3 4 typedef long wchar_t; extern void abort(void); extern int abs(int); extern int atexit(void (*)(void)); extern double atof(const char *); extern int atoi(const char *); extern long int atol(const char *); extern void *bsearch(const void *, const void *, size_t, size_t, int (*)(const void *, const void *)); extern void *calloc(size_t, size_t); extern div_t div(int, int); extern void exit(int); extern void free(void *); extern char *getenv(const char *); extern long int labs(long); extern ldiv_t ldiv(long, long); extern void *malloc(size_t); extern int mblen(const char *, size_t); extern size_t mbstowcs(wchar_t *, const char *, size_t); extern int mbtowc(wchar_t *, const char *, size_t); extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *)); extern int rand(void); extern void *realloc(void *, size_t); extern void srand(unsigned int); extern double strtod(const char *, char **); extern long int strtol(const char *, char **, int); extern unsigned long int strtoul(const char *, char **, int); extern int system(const char *); extern int wctomb(char *, wchar_t); extern size_t wcstombs(char *, const wchar_t *, size_t); # 28 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdlib.h" 2 3 4 # 77 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdlib.h" 3 4 typedef struct { long long quot; long long rem; } lldiv_t; typedef long uid_t; # 121 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdlib.h" 3 4 extern void _exithandle(void); extern double drand48(void); extern double erand48(unsigned short *); extern long jrand48(unsigned short *); extern void lcong48(unsigned short *); extern long lrand48(void); extern long mrand48(void); extern long nrand48(unsigned short *); extern unsigned short *seed48(unsigned short *); extern void srand48(long); extern int putenv(char *); extern void setkey(const char *); # 153 "/opt/toolchain/lib/gcc/sparc-sun-solaris2.9/4.8.2/include-fixed/stdlib.h" 3 4 extern void swab(const char *, char *, ssize_t); extern int mkstemp(char *); extern int mkstemp64(char *); extern long a64l(const char *); extern char *ecvt(double, int, int *, int *); extern char *fcvt(double, int, int *, int *); extern char *gcvt(double, int, char *); extern int getsubopt(char **, char *const *, char **); extern int grantpt(int); extern char *initstate(unsigned, char *, size_t); extern char *l64a(long); extern char *mktemp(char *); extern char *ptsname(int); extern long random(void); extern char *realpath(const char *, char *); extern char *setstate(const char *); extern void srandom(unsigned); extern int ttyslot(void); extern int unlockpt(int); extern void *valloc(size_t); extern void closefrom(int); extern int dup2(int, int); extern int fdwalk(int (*)(void *, int), void *); extern char *qecvt(long double, int, int *, int *); extern char *qfcvt(long double, int, int *, int *); extern char *qgcvt(long double, int, char *); extern char *getcwd(char *, size_t); extern const char *getexecname(void); extern char *getlogin(void); extern int getopt(int, char *const *, const char *); extern char *optarg; extern int optind, opterr, optopt; extern char *getpass(const char *); extern char *getpassphrase(const char *); extern int getpw(uid_t, char *); extern int isatty(int); extern void *memalign(size_t, size_t); extern char *ttyname(int); extern long long atoll(const char *); extern long long llabs(long long); extern lldiv_t lldiv(long long, long long); extern char *lltostr(long long, char *); extern long long strtoll(const char *, char **, int); extern unsigned long long strtoull(const char *, char **, int); extern char *ulltostr(unsigned long long, char *); # 3 "bug.c" 2 int main(int argc, const char* argv[]) { char* value = "12345"; char* end = 0; double bug; { long long bug = 6789; bug = strtoll(value, &end, 10); printf("%ld\n", bug); } return 0; }