[Bug 817768] Re: GCC optimizer removes necessary code

kornelix mikecorn at arcor.de
Mon Aug 8 22:34:47 UTC 2011


I tried to make a small stand-alone test but the test program always
worked. The problem is more involved. Of course my first suspicion was
corruption of memory coming from somewhere else in my program, but this
seems ruled out by the fact that it works fine without optimization and
it works fine when I added the dummy code to reference the variable (ii)
whose code was getting removed. This is all explained in the original
report. My tabular formatting was removed by the bug report utility so
it has to be looked at more carefully.

There were no compiler warnings.

I will try the tests with 4.5 and 4.6 tomorrow.

On 08/08/2011 03:21 PM, Matthias Klose wrote:
> - please recheck with GCC 4.5 and GCC 4.6 in oneiric.
> - please attach a self-contained example, including the command options used
> - include the warnings building the file.
>
> ** Changed in: gcc-defaults (Ubuntu)
>         Status: New =>  Incomplete
>

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to gcc-defaults in Ubuntu.
https://bugs.launchpad.net/bugs/817768

Title:
  GCC optimizer removes necessary code

Status in “gcc-defaults” package in Ubuntu:
  Incomplete

Bug description:
  GCC 4.5.2 in Ubuntu 11.04

  The program below crashes when compiled with GCC 4.5.2 with optimization
  level -O3. This is apparently a bug in GCC.

  The crash does not occur if the program is compiled with an earlier
  release of GCC, also with -O3 optimization.

  The crash does not occur if the program is compiled without
  optimization.

  The crash does not occur if a do-nothing line of code is added which
  makes a reference to the variable involved. Apparently this stops GCC
  from optimizing-out necessary code. 

  Crash matrix

  GCC level    Optimization    dummy code    result
  4.4.5             -O3                      no                     OK
  4.5.2             -O0                      no                     OK
  4.5.2             -O3                      no                     crash
  4.5.2             -O3                      yes                    OK

  There is the crash report from GDB:

  Program received signal SIGSEGV, Segmentation fault.
  0x0000000000498051 in pvlist_remove (pv=0x306b6fc, ii=<value optimized out>) at zfuncs.cc:1774
  1774	      pv->list[ii-1] = pv->list[ii];
  (gdb) q

  Here is the relevant part of the program. The commented line will never
  execute the printf() call but it does stop the program from crashing.

  struct  pvlist {
     int      max;                          //  max. entries
     int      act;                          //  actual entries
     char   **list;                         //  entries
  };

  pvlist * pvlist_create(int max);                                           //  create pvlist
  void pvlist_free(pvlist *pv);                                              //  free pvlist
  int pvlist_append(pvlist *pv, cchar *entry, int unique = 0);               //  append new entry (opt. if unique)
  int pvlist_prepend(pvlist *pv, cchar *entry, int unique = 0);              //  prepend new entry (opt. if unique)
  int pvlist_find(pvlist *pv, cchar *entry);                                 //  find entry by name
  int pvlist_remove(pvlist *pv, cchar *entry);                               //  remove entry by name
  int pvlist_remove(pvlist *pv, int Nth);                                    //  remove entry by number (0...)
  int pvlist_count(pvlist *pv);                                              //  return entry count
  int pvlist_replace(pvlist *pv, int Nth, cchar *entry);                     //  replace Nth entry (0...)
  char * pvlist_get(pvlist *pv, int Nth);                                    //  return Nth entry (0...)
  int pvlist_sort(pvlist *pv);                                               //  sort list, ascending

  
  //  remove an entry by number and repack list
     
  int pvlist_remove(pvlist *pv, int ii)
  {
     if (ii < 0 || ii >= pv->act) return -1;
     zfree(pv->list[ii]);
     for (ii++; ii < pv->act; ii++) {
        if (! pv->act) printf("meaningless reference %d",ii);                //  get around GCC optimization bug
        pv->list[ii-1] = pv->list[ii];
     }
     pv->act--;
     return 0;
  }

  ProblemType: Bug
  DistroRelease: Ubuntu 11.04
  Package: gcc 4:4.5.2-1ubuntu3
  ProcVersionSignature: Ubuntu 2.6.38-10.46-generic 2.6.38.7
  Uname: Linux 2.6.38-10-generic x86_64
  NonfreeKernelModules: nvidia
  Architecture: amd64
  Date: Fri Jul 29 00:00:30 2011
  InstallationMedia: Ubuntu 11.04 "Natty Narwhal" - Release amd64 (20110427.1)
  ProcEnviron:
   LANGUAGE=en_US:en
   LANG=en_US.UTF-8
   SHELL=/bin/bash
  SourcePackage: gcc-defaults
  UpgradeStatus: No upgrade log present (probably fresh install)

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/817768/+subscriptions




More information about the foundations-bugs mailing list