https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90091

            Bug ID: 90091
           Summary: [GCOV] code formatting lead to incorrect code coverage
                    for "if ( expr1 || expr2) " statement
           Product: gcc
           Version: 9.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/local/gcc-trunk/libexec/gcc/x86_64-pc-linux-gnu/9.0.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-trunk/configure --enable-languages=c,c++
--disable-multilib --prefix=/usr/local/gcc-trunk
Thread model: posix
gcc version 9.0.1 20190414 (experimental) (GCC)

$ cat small.c
long f1(long a){return a&0xff000000L;}
long f2(long a){return a&~0xff000000L;}

void main ()
{
  long a = 0x89ABCDEF;

  if (f1(a)!=0x89000000L||
      f2(a)!=0x00ABCDEFL)
    abort();
  exit(0);
}

$ gcc -w -O0 --coverage small.c; ./a.out; gcov small.c; cat small.c.gcov
File 'small.c'
Lines executed:87.50% of 8
Creating 'small.c.gcov'

        -:    0:Source:small.c
        -:    0:Graph:small.gcno
        -:    0:Data:small.gcda
        -:    0:Runs:1
        1:    1:long f1(long a){return a&0xff000000L;}
        1:    2:long f2(long a){return a&~0xff000000L;}
        -:    3:
        1:    4:void main ()
        -:    5:{
        1:    6:  long a = 0x89ABCDEF;
        -:    7:
        2:    8:  if (f1(a)!=0x89000000L||
        1:    9:      f2(a)!=0x00ABCDEFL)
    #####:   10:    abort();
        1:   11:  exit(0);
        -:   12:}


Line #8 is wrongly marked as executed twice. 

When Line #8 and Line #9 is in the same code line, the code coverage report is
correct as follows:
$ gcc -w -O0 --coverage small.c; ./a.out; gcov small.c; cat small.c.gcov
libgcov profiling error:/home/yyb/cv-emi/small.gcda:overwriting an existing
profile data with a different timestamp
File 'small.c'
Lines executed:85.71% of 7
Creating 'small.c.gcov'

        -:    0:Source:small.c
        -:    0:Graph:small.gcno
        -:    0:Data:small.gcda
        -:    0:Runs:1
        1:    1:long f1(long a){return a&0xff000000L;}
        1:    2:long f2(long a){return a&~0xff000000L;}
        -:    3:
        1:    4:void main ()
        -:    5:{
        1:    6:  long a = 0x89ABCDEF;
        -:    7:
        1:    8:  if (f1(a)!=0x89000000L||f2(a)!=0x00ABCDEFL)
    #####:    9:    abort();
        1:   10:  exit(0);
        -:   11:}

Reply via email to