Bug 85294 - [GCOV] A "if(0) break;" statement is wrongly marked as executed when they are nested in for(;;) statement and prefixed with an struct declaration and followed by "if(1) break;" statement in gcov
Summary: [GCOV] A "if(0) break;" statement is wrongly marked as executed when they ar...
Status: RESOLVED WONTFIX
Alias: None
Product: gcc
Classification: Unclassified
Component: gcov-profile (show other bugs)
Version: 8.0
: P3 normal
Target Milestone: 9.0
Assignee: Martin Liška
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-04-09 08:26 UTC by Anonymous
Modified: 2018-07-24 13:19 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2018-04-09 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Anonymous 2018-04-09 08:26:27 UTC
$ gcc -v 
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
struct s {int a;};
void main() {
  for (;;) {
    struct s s1;
    if (0)
      break;
    if (1)
      break;
  }
}

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

        -:    0:Source:small.c
        -:    0:Graph:small.gcno
        -:    0:Data:small.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:struct s {int a;};
        1:    2:void main() {
        -:    3:  for (;;) {
        -:    4:    struct s s1;
        -:    5:    if (0)
        1:    6:      break;
        -:    7:    if (1)
        1:    8:      break;
        -:    9:  }
        1:   10:}


Line #6 is wrongly marked as executed.
Comment 1 Anonymous 2018-04-09 08:32:54 UTC
1. when removing Line #7 and Line #8, the result is correct. 
2. when removing Line #4, the result is also correct. 


Besides, there is an existing bug 85274 is similar to the current bug. Bug 85274 is copyed as follows. It is unclear whether this one is a duplication of bug 85274.  

$ cat small.c
struct s {int s1;};
int a = 0;
int main() {
  for (; 1;) {
    struct s g;
    if (0)
      return 2;
    return 0;
    a = 0;
  }
  return 0;
}

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

        -:    0:Source:small.c
        -:    0:Graph:small.gcno
        -:    0:Data:small.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:struct s {int s1;};
        -:    2:int a = 0;
        1:    3:int main() {
        1:    4:  for (; 1;) {
        -:    5:    struct s g;
        -:    6:    if (0)
        1:    7:      return 2;
        1:    8:    return 0;
        -:    9:    a = 0;
        -:   10:  }
    #####:   11:  return 0;
        -:   12:}

******
Line #7 is wrongly marked as executed.
Comment 2 Martin Liška 2018-07-24 13:19:32 UTC
CFG:

main ()
{
  struct s s1;

  <bb 2> :

  <bb 3> :

  <bb 4> :
  s1 ={v} {CLOBBER};
  return;

}

again it's folded away the dead code.