https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101412
Bug ID: 101412 Summary: [Gcov] an if statement leads to incorrect coverage of the case statement Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: gcov-profile Assignee: unassigned at gcc dot gnu.org Reporter: byone.heng at gmail dot com CC: marxin at gcc dot gnu.org Target Milestone: --- $./gcc -v Using built-in specs. COLLECT_GCC=./gcc COLLECT_LTO_WRAPPER=/home/x/project/gcc/build/install/libexec/gcc/x86_64-pc-linux-gnu/11.0.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ../configure --prefix=/home/x/project/gcc/build/install --enable-checking=release --enable-languages=c,c++ --disable-multilib Thread model: posix Supported LTO compression algorithms: zlib gcc version 11.0.0 20210105 (experimental) (GCC) $cat test.c —————————————————————————— #include <stdio.h> static volatile unsigned char true_var = 1; const unsigned short int false_var = 0; g () { return '\n'; } f () { char s[] = "abcedfg012345"; char *sp = s + 12; switch (g ()) { if( true_var > 0 ) { case '\n': break; } } while (*--sp == '0') ; sprintf (sp + 1, "X"); if (s[12] != 'X') abort (); } main () { f (); exit (0); } —————————————————————————— $gcc -O0 --coverage test.c;./a.out;gcov test;cat test.c.gcov -: 1:#include <stdio.h> -: 2: -: 3:static volatile unsigned char true_var = 1; -: 4:const unsigned short int false_var = 0; 1: 5:g () -: 6:{ 1: 7: return '\n'; -: 8:} -: 9: 1: 10:f () -: 11:{ 1: 12: char s[] = "abcedfg012345"; 1: 13: char *sp = s + 12; -: 14: 1: 15: switch (g ()) -: 16: { -: 17: if( true_var > 0 ) -: 18: { -: 19: case '\n': 1: 20: break; -: 21: } -: 22: } -: 23: 1: 24: while (*--sp == '0') -: 25: ; 1: 26: sprintf (sp + 1, "X"); -: 27: 1: 28: if (s[12] != 'X') #####: 29: abort (); 1: 30:} -: 31: 1: 32:main () -: 33:{ 1: 34: f (); 1: 35: exit (0); -: 36:} Line 19 should be executed once.