https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85350
Bug ID: 85350 Summary: [GCOV] wrong coverage when using constant variable in struct declaration Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: gcov-profile Assignee: unassigned at gcc dot gnu.org Reporter: yangyibiao at nju dot edu.cn CC: marxin at gcc dot gnu.org Target Milestone: --- $ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 8-20170923-1ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs --enable-languages=c,c++,go,brig,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-8 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 8.0.0 20170923 (experimental) [trunk revision 253118] (Ubuntu 8-20170923-1ubuntu2) $ cat small.c #include <stdio.h> int main (void) { const int t = 2; struct s1 { int x; int g[t]; }; struct s2 { int x; int g[2]; }; printf("Sucess!\n"); return 0; } $ gcc --coverage small.c; ./a.out; gcov-8 small.c; cat small.c.gcov Sucess! File 'small.c' Lines executed:100.00% of 6 Creating 'small.c.gcov' -: 0:Source:small.c -: 0:Graph:small.gcno -: 0:Data:small.gcda -: 0:Runs:1 -: 0:Programs:1 -: 1:#include <stdio.h> -: 2: 1: 3:int main (void) -: 4:{ 1: 5: const int t = 2; 2: 6: struct s1 { -: 7: int x; 1: 8: int g[t]; -: 9: }; -: 10: -: 11: struct s2 { -: 12: int x; -: 13: int g[2]; -: 14: }; -: 15: 1: 16: printf("Sucess!\n"); 1: 17: return 0; -: 18:} Line #6 is wrongly marked as executed twice. The second struct declaration is not using constant variable t. By comparing these two structs, we can know that constant variable should be the reason that leads to the incorrect coverage.