Hello, the following source file (here called `gcc_bug.c') triggers
`-Wmaybe-uninitialized' when compiled with `-Os', `-O1' or stronger
optimisation, plus `-Wall':
------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
static int mk (int **a, int **b, int **c) {
if (!(*a = malloc (sizeof (int)))) goto a_err;
if (!(*b = malloc (sizeof (int)))) goto b_err;
if (!(*c = malloc (sizeof (int)))) goto c_err;
return 1; c_err:
free (*b); b_err:
free (*a); a_err:
return 0;
}
static void fin (int *a, int *b, int *c) {
free (c);
free (b);
free (a);
}
int main (void) {
int *a, *b, *c, x, flag = mk (&a, &b, &c);
while ((x = getchar ()) != -1) {
if (flag) switch (x) {
case 0:
break;
default:
goto retn;
} else if (x) goto retn;
}
retn:
if (flag) fin (a, b, c);
return 0;
}
------------------------------------------------------------------------
Attached are required output files:
* gcc_bug.txt: `gcc -v -save-temps -Wall -O2 -c gcc_bug.c -o gcc_bug.o'.
* gcc_bug.ii: `sed '/^#/d; /^[ \t]*$/d' < gcc_bug.i'.
--
My current OpenPGP key:
RSA4096/0x227E8CAAB7AA186C (expires: 2020.10.19)
7077 7781 B859 5166 AE07 0286 227E 8CAA B7AA 186C
Using built-in specs.
COLLECT_GCC=gcc
Target: x86_64-alpine-linux-musl
Configured with: /home/buildozer/aports/main/gcc/src/gcc-5.3.0/configure
--prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
--build=x86_64-alpine-linux-musl --host=x86_64-alpine-linux-musl
--target=x86_64-alpine-linux-musl --with-pkgversion='Alpine 5.3.0'
--enable-checking=release --disable-fixed-point --disable-libstdcxx-pch
--disable-multilib --disable-nls --disable-werror --disable-symvers
--enable-__cxa_atexit --enable-esp --enable-cloog-backend
--enable-languages=c,c++,objc,java,fortran,ada --disable-libssp
--disable-libmudflap --disable-libsanitizer --enable-shared --enable-threads
--enable-tls --with-system-zlib
Thread model: posix
gcc version 5.3.0 (Alpine 5.3.0)
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-O2' '-c' '-o' 'gcc_bug.o'
'-mtune=generic' '-march=x86-64' '-fPIE' '-pie' '-fstack-protector-strong'
/usr/libexec/gcc/x86_64-alpine-linux-musl/5.3.0/cc1 -E -quiet -v gcc_bug.c
-fno-strict-overflow -mtune=generic -march=x86-64 -Wall -fPIE
-fstack-protector-strong -O2 -fpch-preprocess -o gcc_bug.i
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/include/fortify
/usr/include
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-O2' '-c' '-o' 'gcc_bug.o'
'-mtune=generic' '-march=x86-64' '-fPIE' '-pie' '-fstack-protector-strong'
/usr/libexec/gcc/x86_64-alpine-linux-musl/5.3.0/cc1 -fpreprocessed gcc_bug.i
-fno-strict-overflow -quiet -dumpbase gcc_bug.c -mtune=generic -march=x86-64
-auxbase-strip gcc_bug.o -O2 -Wall -version -fPIE -fstack-protector-strong -o
gcc_bug.s
GNU C11 (Alpine 5.3.0) version 5.3.0 (x86_64-alpine-linux-musl)
compiled by GNU C version 5.3.0, GMP version 6.1.0, MPFR version 3.1.2,
MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=63321
GNU C11 (Alpine 5.3.0) version 5.3.0 (x86_64-alpine-linux-musl)
compiled by GNU C version 5.3.0, GMP version 6.1.0, MPFR version 3.1.2,
MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=63321
Compiler executable checksum: e0c13e9a002c6d480b493a417dbb9bdc
gcc_bug.c: In function 'main':
gcc_bug.c:18:2: warning: 'c' may be used uninitialized in this function
[-Wmaybe-uninitialized]
free (c);
^
gcc_bug.c:24:15: note: 'c' was declared here
int *a, *b, *c, x, flag = mk (&a, &b, &c);
^
gcc_bug.c:19:2: warning: 'b' may be used uninitialized in this function
[-Wmaybe-uninitialized]
free (b);
^
gcc_bug.c:24:11: note: 'b' was declared here
int *a, *b, *c, x, flag = mk (&a, &b, &c);
^
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-O2' '-c' '-o' 'gcc_bug.o'
'-mtune=generic' '-march=x86-64' '-fPIE' '-pie' '-fstack-protector-strong'
/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/as
-v --64 -o gcc_bug.o gcc_bug.s
GNU assembler version 2.26 (x86_64-alpine-linux-musl) using BFD version (GNU
Binutils) 2.26.20160125
COMPILER_PATH=/usr/libexec/gcc/x86_64-alpine-linux-musl/5.3.0/:/usr/libexec/gcc/x86_64-alpine-linux-musl/5.3.0/:/usr/libexec/gcc/x86_64-alpine-linux-musl/:/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/:/usr/lib/gcc/x86_64-alpine-linux-musl/:/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/bin/
LIBRARY_PATH=/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/:/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/lib/../lib/:/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../../x86_64-alpine-linux-musl/lib/:/usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-O2' '-c' '-o' 'gcc_bug.o'
'-mtune=generic' '-march=x86-64' '-fPIE' '-pie' '-fstack-protector-strong'
__extension__
typedef __builtin_va_list va_list;
typedef __builtin_va_list __isoc_va_list;
typedef unsigned long size_t;
typedef long ssize_t;
typedef long off_t;
typedef struct _IO_FILE FILE;
typedef union _G_fpos64_t {
char __opaque[16];
double __align;
} fpos_t;
extern FILE *const stdin;
extern FILE *const stdout;
extern FILE *const stderr;
FILE *fopen(const char *restrict, const char *restrict);
FILE *freopen(const char *restrict, const char *restrict, FILE *restrict);
int fclose(FILE *);
int remove(const char *);
int rename(const char *, const char *);
int feof(FILE *);
int ferror(FILE *);
int fflush(FILE *);
void clearerr(FILE *);
int fseek(FILE *, long, int);
long ftell(FILE *);
void rewind(FILE *);
int fgetpos(FILE *restrict, fpos_t *restrict);
int fsetpos(FILE *, const fpos_t *);
size_t fread(void *restrict, size_t, size_t, FILE *restrict);
size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict);
int fgetc(FILE *);
int getc(FILE *);
int getchar(void);
int ungetc(int, FILE *);
int fputc(int, FILE *);
int putc(int, FILE *);
int putchar(int);
char *fgets(char *restrict, int, FILE *restrict);
int fputs(const char *restrict, FILE *restrict);
int puts(const char *);
int printf(const char *restrict, ...);
int fprintf(FILE *restrict, const char *restrict, ...);
int sprintf(char *restrict, const char *restrict, ...);
int snprintf(char *restrict, size_t, const char *restrict, ...);
int vprintf(const char *restrict, __isoc_va_list);
int vfprintf(FILE *restrict, const char *restrict, __isoc_va_list);
int vsprintf(char *restrict, const char *restrict, __isoc_va_list);
int vsnprintf(char *restrict, size_t, const char *restrict, __isoc_va_list);
int scanf(const char *restrict, ...);
int fscanf(FILE *restrict, const char *restrict, ...);
int sscanf(const char *restrict, const char *restrict, ...);
int vscanf(const char *restrict, __isoc_va_list);
int vfscanf(FILE *restrict, const char *restrict, __isoc_va_list);
int vsscanf(const char *restrict, const char *restrict, __isoc_va_list);
void perror(const char *);
int setvbuf(FILE *restrict, char *restrict, int, size_t);
void setbuf(FILE *restrict, char *restrict);
char *tmpnam(char *);
FILE *tmpfile(void);
FILE *fmemopen(void *restrict, size_t, const char *restrict);
FILE *open_memstream(char **, size_t *);
FILE *fdopen(int, const char *);
FILE *popen(const char *, const char *);
int pclose(FILE *);
int fileno(FILE *);
int fseeko(FILE *, off_t, int);
off_t ftello(FILE *);
int dprintf(int, const char *restrict, ...);
int vdprintf(int, const char *restrict, __isoc_va_list);
void flockfile(FILE *);
int ftrylockfile(FILE *);
void funlockfile(FILE *);
int getc_unlocked(FILE *);
int getchar_unlocked(void);
int putc_unlocked(int, FILE *);
int putchar_unlocked(int);
ssize_t getdelim(char **restrict, size_t *restrict, int, FILE *restrict);
ssize_t getline(char **restrict, size_t *restrict, FILE *restrict);
int renameat(int, const char *, int, const char *);
char *ctermid(char *);
char *tempnam(const char *, const char *);
char *cuserid(char *);
void setlinebuf(FILE *);
void setbuffer(FILE *, char *, size_t);
int fgetc_unlocked(FILE *);
int fputc_unlocked(int, FILE *);
int fflush_unlocked(FILE *);
size_t fread_unlocked(void *, size_t, size_t, FILE *);
size_t fwrite_unlocked(const void *, size_t, size_t, FILE *);
void clearerr_unlocked(FILE *);
int feof_unlocked(FILE *);
int ferror_unlocked(FILE *);
int fileno_unlocked(FILE *);
int getw(FILE *);
int putw(int, FILE *);
char *fgetln(FILE *, size_t *);
int asprintf(char **, const char *, ...);
int vasprintf(char **, const char *, __isoc_va_list);
__typeof__(fgets) __orig_fgets __asm__("" "fgets"); extern __inline__
__attribute__((__always_inline__,__gnu_inline__,__artificial__)) char
*fgets(char *__s, int __n, FILE *__f)
{
size_t __b = __builtin_object_size(__s, 0);
if ((size_t)__n > __b)
__builtin_trap();
return __orig_fgets(__s, __n, __f);
}
__typeof__(fread) __orig_fread __asm__("" "fread"); extern __inline__
__attribute__((__always_inline__,__gnu_inline__,__artificial__)) size_t
fread(void *__d, size_t __n, size_t __m, FILE *__f)
{
size_t __b = __builtin_object_size(__d, 0);
if (__n != 0 && (__n * __m) / __n != __m)
__builtin_trap();
if (__n * __m > __b)
__builtin_trap();
return __orig_fread(__d, __n, __m, __f);
}
__typeof__(fwrite) __orig_fwrite __asm__("" "fwrite"); extern __inline__
__attribute__((__always_inline__,__gnu_inline__,__artificial__)) size_t
fwrite(const void *__d, size_t __n, size_t __m, FILE *__f)
{
size_t __b = __builtin_object_size(__d, 0);
if (__n != 0 && (__n * __m) / __n != __m)
__builtin_trap();
if (__n * __m > __b)
__builtin_trap();
return __orig_fwrite(__d, __n, __m, __f);
}
__typeof__(vsnprintf) __orig_vsnprintf __asm__("" "vsnprintf"); extern
__inline__ __attribute__((__always_inline__,__gnu_inline__,__artificial__)) int
vsnprintf(char *__s, size_t __n, const char *__f,
__builtin_va_list __v)
{
size_t __b = __builtin_object_size(__s, 0);
if (__n > __b)
__builtin_trap();
return __orig_vsnprintf(__s, __n, __f, __v);
}
__typeof__(vsprintf) __orig_vsprintf __asm__("" "vsprintf"); extern __inline__
__attribute__((__always_inline__,__gnu_inline__,__artificial__)) int
vsprintf(char *__s, const char *__f, __builtin_va_list __v)
{
size_t __b = __builtin_object_size(__s, 0);
int __r;
if (__b != (size_t)-1) {
__r = __orig_vsnprintf(__s, __b, __f, __v);
if (__r != -1 && (size_t)__r >= __b)
__builtin_trap();
} else {
__r = __orig_vsprintf(__s, __f, __v);
}
return __r;
}
__typeof__(snprintf) __orig_snprintf __asm__("" "snprintf"); extern __inline__
__attribute__((__always_inline__,__gnu_inline__,__artificial__)) int
snprintf(char *__s, size_t __n, const char *__f, ...)
{
size_t __b = __builtin_object_size(__s, 0);
if (__n > __b)
__builtin_trap();
return __orig_snprintf(__s, __n, __f, __builtin_va_arg_pack());
}
__typeof__(sprintf) __orig_sprintf __asm__("" "sprintf"); extern __inline__
__attribute__((__always_inline__,__gnu_inline__,__artificial__)) int
sprintf(char *__s, const char *__f, ...)
{
size_t __b = __builtin_object_size(__s, 0);
int __r;
if (__b != (size_t)-1) {
__r = __orig_snprintf(__s, __b, __f, __builtin_va_arg_pack());
if (__r != -1 && (size_t)__r >= __b)
__builtin_trap();
} else {
__r = __orig_sprintf(__s, __f, __builtin_va_arg_pack());
}
return __r;
}
__extension__
typedef int wchar_t;
int atoi (const char *);
long atol (const char *);
long long atoll (const char *);
double atof (const char *);
float strtof (const char *restrict, char **restrict);
double strtod (const char *restrict, char **restrict);
long double strtold (const char *restrict, char **restrict);
long strtol (const char *restrict, char **restrict, int);
unsigned long strtoul (const char *restrict, char **restrict, int);
long long strtoll (const char *restrict, char **restrict, int);
unsigned long long strtoull (const char *restrict, char **restrict, int);
int rand (void);
void srand (unsigned);
void *malloc (size_t);
void *calloc (size_t, size_t);
void *realloc (void *, size_t);
void free (void *);
void *aligned_alloc(size_t alignment, size_t size);
_Noreturn void abort (void);
int atexit (void (*) (void));
_Noreturn void exit (int);
_Noreturn void _Exit (int);
int at_quick_exit (void (*) (void));
_Noreturn void quick_exit (int);
char *getenv (const char *);
int system (const char *);
void *bsearch (const void *, const void *, size_t, size_t, int (*)(const void
*, const void *));
void qsort (void *, size_t, size_t, int (*)(const void *, const void *));
int abs (int);
long labs (long);
long long llabs (long long);
typedef struct { int quot, rem; } div_t;
typedef struct { long quot, rem; } ldiv_t;
typedef struct { long long quot, rem; } lldiv_t;
div_t div (int, int);
ldiv_t ldiv (long, long);
lldiv_t lldiv (long long, long long);
int mblen (const char *, size_t);
int mbtowc (wchar_t *restrict, const char *restrict, size_t);
int wctomb (char *, wchar_t);
size_t mbstowcs (wchar_t *restrict, const char *restrict, size_t);
size_t wcstombs (char *restrict, const wchar_t *restrict, size_t);
size_t __ctype_get_mb_cur_max(void);
int posix_memalign (void **, size_t, size_t);
int setenv (const char *, const char *, int);
int unsetenv (const char *);
int mkstemp (char *);
int mkostemp (char *, int);
char *mkdtemp (char *);
int getsubopt (char **, char *const *, char **);
int rand_r (unsigned *);
char *realpath (const char *restrict, char *restrict);
long int random (void);
void srandom (unsigned int);
char *initstate (unsigned int, char *, size_t);
char *setstate (char *);
int putenv (char *);
int posix_openpt (int);
int grantpt (int);
int unlockpt (int);
char *ptsname (int);
char *l64a (long);
long a64l (const char *);
void setkey (const char *);
double drand48 (void);
double erand48 (unsigned short [3]);
long int lrand48 (void);
long int nrand48 (unsigned short [3]);
long mrand48 (void);
long jrand48 (unsigned short [3]);
void srand48 (long);
unsigned short *seed48 (unsigned short [3]);
void lcong48 (unsigned short [7]);
void *alloca(size_t);
char *mktemp (char *);
int mkstemps (char *, int);
int mkostemps (char *, int, int);
void *valloc (size_t);
void *memalign(size_t, size_t);
int getloadavg(double *, int);
int clearenv(void);
__extension__
__typeof__(realpath) __orig_realpath __asm__("" "realpath"); extern __inline__
__attribute__((__always_inline__,__gnu_inline__,__artificial__)) char
*realpath(const char *__p, char *__r)
{
size_t __b = __builtin_object_size(__r, 0);
if (__r) {
char __buf[4096], *__ret;
size_t __l;
__ret = __orig_realpath(__p, __buf);
if (!__ret)
return ((void*)0);
__l = __builtin_strlen(__ret) + 1;
if (__l > __b)
__builtin_trap();
__builtin_memcpy(__r, __ret, __l);
return __r;
}
return __orig_realpath(__p, __r);
}
static int mk (int **a, int **b, int **c) {
if (!(*a = malloc (sizeof (int)))) goto a_err;
if (!(*b = malloc (sizeof (int)))) goto b_err;
if (!(*c = malloc (sizeof (int)))) goto c_err;
return 1; c_err:
free (*b); b_err:
free (*a); a_err:
return 0;
}
static void fin (int *a, int *b, int *c) {
free (c);
free (b);
free (a);
}
int main (void) {
int *a, *b, *c, x, flag = mk (&a, &b, &c);
while ((x = getchar ()) != -1) {
if (flag) switch (x) {
case 0:
break;
default:
goto retn;
} else if (x) goto retn;
}
retn:
if (flag) fin (a, b, c);
return 0;
}