https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85783
Bug ID: 85783 Summary: alloc-size-larger-than fires incorrectly with new[] and can't be disabled Product: gcc Version: 8.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: psmith at gnu dot org Target Milestone: --- Created attachment 44131 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44131&action=edit sample source file GCC 8.1.0 / binutils 2.30 GNU/Linux x86_64 with a sysroot of Red Hat EL 6.5. Recently I started upgrading from GCC 7.3 to GCC 8.1. I discovered three locations in my codebase where the alloc-size-larger-than warning is generated. It wasn't ever generated with 7.3. Since I build with -Wall -Werror this causes compiles to fail. The first issue is, I wasn't able to find any way to turn off this warning other than by removing -Wall which seems entirely too severe. There should be some way to disable it; maybe by providing -Walloc-size-larger-than=0 or similar. I did work around this issue by casting the value given to new[] to type unsigned int, but that's unpleasant. Of course removing the false positive would be helpful as well. I spent quite a while trying to create a small sample; the results are below. Most any change to this file appears to cause the warning to go away: for example I tried to use a simple template I created rather than std::shared_ptr<>, or even remove that field altogether: no warning. If I remove or modify the if-statements in the method significantly, no warning. Etc. I didn't try all changes of course. Also without optimization it doesn't warn but with both -O1 and -O2 it does. Results of compiling the attached file: $ x86_64-rh65-linux-gnu-g++ -v -o /tmp/SP.o -c -O2 -Wall -Werror params.cpp Using built-in specs. COLLECT_GCC=/work/src/build/x86_64-linux/cc/generic/bin/x86_64-generic-linux-gnu-g++ Target: x86_64-generic-linux-gnu Configured with: /work/src/cc/gcc-8.1.0/configure --disable-nls --disable-werror --prefix=/work/src/cc/x86_64-linux/final/generic --host=x86_64-tools-linux-gnu --target=x86_64-generic-linux-gnu --with-sysroot=/work/src/build/x86_64-linux/sysroot/generic CFLAGS=-O2 CXXFLAGS=-O2 LDFLAGS=-O2 --enable-gold --enable-languages=c,c++ Thread model: posix gcc version 8.1.0 (GCC) COLLECT_GCC_OPTIONS='-m64' '-isystem' '=/usr/include-fixed' '-v' '-o' '/tmp/SP.o' '-c' '-O2' '-Wall' '-Werror' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /work/src/build/x86_64-linux/cc/generic/bin/../libexec/gcc/x86_64-generic-linux-gnu/8.1.0/cc1plus -quiet -v -iprefix /work/src/build/x86_64-linux/cc/generic/bin/../lib/gcc/x86_64-generic-linux-gnu/8.1.0/ -isysroot /work/src/build/x86_64-linux/sysroot/rh65 -D_GNU_SOURCE -isystem =/usr/include-fixed params.cpp -quiet -dumpbase SortParameters.cpp -m64 -mtune=generic -march=x86-64 -auxbase-strip /tmp/SP.o -O2 -Wall -Werror -version -o /tmp/ccuJobAh.s GNU C++14 (GCC) version 8.1.0 (x86_64-generic-linux-gnu) compiled by GNU C version 8.1.0, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3, isl version isl-0.18-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: e2fe942476766bd673c0e36030131141 In function 'void* operator new [](size_t)', inlined from 'static Params* Params::buildParams(size_t, Info*)' at params.cpp:52:47: params.cpp:8:21: error: argument 1 value '18446744073709551615' exceeds maximum object size 9223372036854775807 [-Werror=alloc-size-larger-than=] void* p = malloc(size); ~~~~~~^~~~~~ ... /work/src/build/x86_64-linux/sysroot/rh65/usr/include/stdlib.h: In static member function 'static Params* Params::buildParams(size_t, Info*)': /work/src/build/x86_64-linux/sysroot/rh65/usr/include/stdlib.h:471:14: note: in a call to allocation function 'void* malloc(size_t)' declared here extern void *malloc (size_t __size) __THROW __attribute_malloc__ __wur; ^~~~~~ cc1plus: all warnings being treated as errors