Package: gcc Version: 3.3.5-3 When compiled with -O2, the appended test program goes into an infinite loop at run-time. When compiled with -O or with no optimization, it runs correctly, exiting immediately and generating no output.
I am using Debian GNU/Linux 3.1, with a 2.4.28 kernel and libc6-2.3.2.ds1-22 #include <math.h> #include <float.h> #include <stdio.h> /* gcc optimization bug * * Problem: Program goes into an infinite loop when * compiled with -O2 optimization. * * compile: gcc $OPT bug.c -lm * run: ./a.out * * gcc -O bug.c -lm => works with 2.95.4, 3.3.5, 3.4.4, 4.0.0 * gcc -O2 bug.c -lm => infinite loop with 3.3.5 and 3.4.4 * => works with 2.95.4 and 4.0.0 */ static int bisection (double (*func)(double, void *), double a, double b, void *cd, double *xp) { unsigned int count = 1; unsigned int bisect_count = 5; double fa, fb; double x = a; if (a > b) { double tmp = a; a = b; b = tmp; } fa = (*func)(a, cd); fb = (*func)(b, cd); if (fa * fb > 0) { *xp = a; return -1; } while (b > a) { double fx; if (fb == 0.0) { x = b; break; } if (fa == 0.0) { x = a; break; } if (count % bisect_count) { x = (a*fb - b*fa) / (fb - fa); if ((x <= a) || (x >= b)) x = 0.5 * (a + b); } else x = 0.5 * (a + b); if ((x <= a) || (x >= b)) break; fx = (*func)(x, cd); count++; if (fx*fa < 0.0) { fb = fx; b = x; } else { fa = fx; a = x; } } *xp = x; return 0; } static double f (double x, void *cd) { (void) cd; return x - cos(x); } int main (void) { double x; (void) bisection (&f, 0.0, 1.0, NULL, &x); if (fabs(f(x,NULL)) > DBL_EPSILON) fprintf (stdout, "Error\n"); return 0; } -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]