|  | /* 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 | 
|  | } | 
|  | } |