The gen_type() function in gcc/c-aux-info.c contains a logic bug that causes
garbage to be output to the file specified by the -aux-info switch.

The crux of the problem is that gen_type() uses a global variable (data_type)
to build parts of the string to be output by -aux-info.  However, there are two
cases where gen_type() indirectly recurses via gen_decl().

Of course, this recursing will overwrite the global variable, and upon return
from the recursion, the "original" value has been lost forever.  This causes
corrupted output into the aux-info file.

This behavior occurs on all targets, and all known versions of gcc since the
-aux-info feature was added.  I have confirmed that it occurs on the latest CVS
sources for 3.3, 3.4, 4.0, 4.1 branches as well as the trunk (currently 4.2).

The problem was triggered by a particularly perverse code generator that (in
one of its own corner cases), generates a function taking an argument that is a
pointer to an anonymous structure declared inside a parameter list.  Strange,
but legal.

You can use the following to reproduce:

/* --- File foo.c --- */
void foo (struct { int a; int b; } * p)
{
}

gcc -Wall -O2 -o foo.o -aux-info foo.X -c foo.c

This causes the following output into foo.X:

/* compiled from: . */
/* foo.c:3:NF */ extern void foo (struct { intint b; } *p); /* (p) struct {
intint b; } *p; */

As you can see, the type of the argument to foo is corrupted.

The correct output is:

/* compiled from: . */
/* foo.c:3:NF */ extern void foo (struct { int a; int b; } *p); /* (p) struct {
int a; int b; } *p; */

Fortunately, the fix is small, isolated, and low-risk.  You simply save a copy
of the contents of the global variable before any recursion.  Since it's
actually affecting me, I request that you apply the fix to 3.3, 3.4, 4.0, 4.1,
and the trunk as soon as is feasible.

I will be posting the patches (to the latest CVS) for 3.3, 3.4, 4.0, 4.1, and
trunk to gcc-patches as soon as I'm done entering this.

Thanks!

Mark F. Haigh
[EMAIL PROTECTED]


-- 
           Summary: Corner case causes garbage to be output by -aux-info
                    switch.
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: markfhaigh at sbcglobal dot net
 GCC build triplet: All
  GCC host triplet: All
GCC target triplet: All


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26613

Reply via email to