Compiler Bug in Ultrix RISC/MIPS C

Fred Chow fred at mips.COM
Fri Dec 1 10:07:49 AEST 1989


In article <1989Nov30.021253.23933 at acd4.UUCP> mjb at acd4.UUCP ( Mike Bryan          ) writes:
>
>
>The following program reveals a bug in the Ultrix 3.1 RISC (MIPS) C
>compiler.  It will work correctly with a -O0 or -O1 flag, but will
>fail for -O2 or higher.  I've stripped the code down to the barest
>minimum possible; removing any part of the "for" loop will cause it to
>compile correctly.
>
>===== Begin Program =====
>
>char Restore_file[4][100];
>main()
>{
>    int i;
>    char cmd[100];
>
>    strcpy( cmd, "hi" );
>    for( i=0; i==0; )
>    {
>        if( strlen( cmd ) == 0 )
>	    break;
>        if( 1 )
>	    ;
>        strcpy ( Restore_file[i++], cmd );
>    }
>    printf( "#0 = '%s'\n", Restore_file[0] );
>    printf( "#1 = '%s'\n", Restore_file[1] );
>}
>
>
>===== End Program =====
>
>When the code compiles incorrectly, it acts as if the i++ in the
>strcpy() call was really ++i (pre-increment instead of
>post-increment).  We will be informing DEC of this bug tomorrow.  One
>workaround (other than not optimizing) is to change the strcpy to look
>like this:
>
>        strcpy ( Restore_file[i], cmd );
>	i++;
>
>I don't know if this is just a DEC bug, or if it affects the MIPS
>compiler in general.  I also don't know any easy way to describe the
>case which causes it, apart from saying "if it looks like the
>example".  It was the simplest case we were able to come up with.  If
>you're having problems, you might check to see if your code has
>anything in common with the above.

	We've verified this to be a bug in MIPS' compilers.  It potentially
occurs whenever an array subscript expression is passed as a parameter to
a function in a loop, and the index is the loop control variable and index
in the subscript expression is being post-incremented.  The workaround is
to take out the post-increment, as you suggested above, or put the i++ in
the "for" statement:

	for( i=0; i==0; i++)

which is the usual way that people write for loops.

	This bug will be fixed in the next compiler release.

-------------
Fred Chow (fred at mips.com)



More information about the Comp.unix.ultrix mailing list