This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

c/4103: gcc 2.95.4 compiles bad code with nested static functions



>Number:         4103
>Category:       c
>Synopsis:       gcc 2.95.4 compiles bad code with nested static functions
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          wrong-code
>Submitter-Id:   net
>Arrival-Date:   Thu Aug 23 11:36:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Cristiano Milia
>Release:        gcc version 2.95.4 20010319 (Debian prerelease)
>Organization:
>Environment:
Linux 2.4.6-mosix #1 SMP i686 
>Description:
f2 is a function defined into another function body, and f pointer is declared static in the same scope of f2.

when assigning address of f2 to f, the correct assignment is correctly done ONLY IF the BODY of f2 is defined AFTER the assignment statement.

the result of this wrong address generation is an "illegal instruction" at runtime, when executing (*f)().

the fact is that f is assigned a value that is NOT the actual f2 value.
it seems to me that if f2 is DEFINED before the assignment statement, gcc gets confused about its address, that is not the one f2 had when it was DECLARED. 

function_2 can be have an empty body or not, it always happens.
>How-To-Repeat:
/* this must do a certain thing only the 1st time,
   but we don't want a check as if (first_time) {do},
   so we use a function pointer that the first time
   does, the others just returns.
 */
void loop(void) 
{
   void f1(void);
   void f2(void);
   static void (*f)(void) = f1;

   void f2(void) { } /* this is empty */

   void f1(void)
   {
      /* ... do something */
      f=f2; /* the problem is HERE */
   }

   (*f)(); /* do something only the first time */
}

int main()
{
   loop();
   loop(); /* second time it crashes! */
}
>Fix:
just put the DEFINITION of f2 AFTER the assignment statement:

void loop(void)
{
   void f1(void);
   void f2(void);

   static void (*f)(void) = f1;

   void f1(void)
   {
      f=f2; /* NOW it correctly assigns the address of f2 */
   }

   void f2(void) { }

   (*f)();
}
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/x-gzip-compressed; name="test.i.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test.i.gz"

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]