https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101416
Bug ID: 101416 Summary: [Gcov] wrong coverage for an if 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 —————————————————————————— const long int true_var = 1; static const int false_var = 0; #include <limits.h> #include <sys/types.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #ifndef MAP_ANON #ifdef MAP_ANONYMOUS #define MAP_ANON MAP_ANONYMOUS #else #define MAP_ANON MAP_FILE #endif #endif #ifndef MAP_FILE #define MAP_FILE 0 #endif #ifndef MAP_FIXED #define MAP_FIXED 0 #endif #define MAP_START (void *)0x7fff8000 #define MAP_LEN 0x10000 #define OFFSET (MAP_LEN/2 - 2 * sizeof (char)); f (int s, char *p) { int i; for (i = s; &p[i] < &p[40] && i >= 0; i++) { p[i] = -2; } } main () { #ifdef MAP_ANON char *p; int dev_zero; dev_zero = open ("/dev/zero", O_RDONLY); /* -1 is OK when we have MAP_ANON; else mmap will flag an error. */ if (INT_MAX != 0x7fffffffL || sizeof (char *) != sizeof (int)) exit (0); p = mmap (MAP_START, MAP_LEN, PROT_READ|PROT_WRITE, MAP_ANON|MAP_FIXED|MAP_PRIVATE, dev_zero, 0); if (p != (char *)-1) { p += OFFSET; p[39] = 0; f (0, p); if (p[39] != (char)-2) abort (); p[39] = 0; f (-1, p); if (p[39] != 0) abort (); } #endif exit (0); } —————————————————————————— $gcc -O0 --coverage test.c;./a.out;gcov test;cat test.c.gcov -: 4:const long int true_var = 1; -: 5:static const int false_var = 0; -: 6: -: 7:#include <limits.h> -: 8: -: 9:#include <sys/types.h> -: 10:#include <sys/mman.h> -: 11:#include <sys/stat.h> -: 12:#include <fcntl.h> -: 13:#ifndef MAP_ANON -: 14:#ifdef MAP_ANONYMOUS -: 15:#define MAP_ANON MAP_ANONYMOUS -: 16:#else -: 17:#define MAP_ANON MAP_FILE -: 18:#endif -: 19:#endif -: 20:#ifndef MAP_FILE -: 21:#define MAP_FILE 0 -: 22:#endif -: 23:#ifndef MAP_FIXED -: 24:#define MAP_FIXED 0 -: 25:#endif -: 26: -: 27:#define MAP_START (void *)0x7fff8000 -: 28:#define MAP_LEN 0x10000 -: 29: -: 30:#define OFFSET (MAP_LEN/2 - 2 * sizeof (char)); -: 31: #####: 32:f (int s, char *p) -: 33:{ -: 34: int i; #####: 35: for (i = s; &p[i] < &p[40] && i >= 0; i++) -: 36: { #####: 37: p[i] = -2; -: 38: } #####: 39:} -: 40: 1: 41:main () -: 42:{ -: 43:#ifdef MAP_ANON -: 44: char *p; -: 45: int dev_zero; -: 46: 1: 47: dev_zero = open ("/dev/zero", O_RDONLY); -: 48: /* -1 is OK when we have MAP_ANON; else mmap will flag an error. */ -: 49: if (INT_MAX != 0x7fffffffL || sizeof (char *) != sizeof (int)) 1: 50: exit (0); -: 51: p = mmap (MAP_START, MAP_LEN, PROT_READ|PROT_WRITE, -: 52: MAP_ANON|MAP_FIXED|MAP_PRIVATE, dev_zero, 0); -: 53: if (p != (char *)-1) -: 54: { -: 55: p += OFFSET; -: 56: p[39] = 0; -: 57: f (0, p); -: 58: if (p[39] != (char)-2) -: 59: abort (); -: 60: p[39] = 0; -: 61: f (-1, p); -: 62: if (p[39] != 0) -: 63: abort (); -: 64: } -: 65:#endif -: 66: exit (0); -: 67:} Line 49 should be executed.