46 lines
		
	
	
		
			962 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			962 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* NOCW */
 | 
						|
/* dggccbug.c */
 | 
						|
/* bug found by Eric Young (eay@cryptsoft.com) - May 1995 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * There is a bug in gcc version 2.5.8 (88open OCS/BCS, DG-2.5.8.3, Oct 14
 | 
						|
 * 1994) as shipped with DGUX 5.4R3.10 that can be bypassed by defining
 | 
						|
 * DG_GCC_BUG in my code. The bug manifests itself by the vaule of a pointer
 | 
						|
 * that is used only by reference, not having it's value change when it is
 | 
						|
 * used to check for exiting the loop.  Probably caused by there being 2
 | 
						|
 * copies of the valiable, one in a register and one being an address that is
 | 
						|
 * passed.
 | 
						|
 */
 | 
						|
 | 
						|
/*-
 | 
						|
 * compare the out put from
 | 
						|
 * gcc dggccbug.c; ./a.out
 | 
						|
 * and
 | 
						|
 * gcc -O dggccbug.c; ./a.out
 | 
						|
 * compile with -DFIXBUG to remove the bug when optimising.
 | 
						|
 */
 | 
						|
 | 
						|
void inc(a)
 | 
						|
int *a;
 | 
						|
{
 | 
						|
    (*a)++;
 | 
						|
}
 | 
						|
 | 
						|
main()
 | 
						|
{
 | 
						|
    int p = 0;
 | 
						|
#ifdef FIXBUG
 | 
						|
    int dummy;
 | 
						|
#endif
 | 
						|
 | 
						|
    while (p < 3) {
 | 
						|
        fprintf(stderr, "%08X\n", p);
 | 
						|
        inc(&p);
 | 
						|
#ifdef FIXBUG
 | 
						|
        dummy += p;
 | 
						|
#endif
 | 
						|
    }
 | 
						|
}
 |