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.

Reply via email to