[cairo] FP errors in cairo

John Ellson ellson at research.att.com
Sun May 1 20:17:54 PDT 2005

I'm  getting lots of cairo crashes in my application (graphviz) on 32 
bit machines, but less or none on 64 bit machines. 
I'm a bit surprised that other cairo users aren't seeing problems?  
Perhaps graphviz just generates more curves than other apps.
A gdb tracback is attached.

I think that the problem is that this code is not robust:

    cairo_fixed_16_16_t y_intersect;
    double  m1 = _compute_inverse_slope (l1);
    double  b1 = _compute_x_intercept (l1, m1);
    double  m2 = _compute_inverse_slope (l2);
    double  b2 = _compute_x_intercept (l2, m2);

    if (m1 == m2)
        return 0;

    y_intersect = _cairo_fixed_from_double ((b2 - b1) / (m1 - m2));

The m1 == m2 test is not sufficient to prevent integer overflows on 32 
bit machines.

I see from the comments that there are other concerns about this code.   
Is there a rewite in the works
or should I take a shot at improving the stability of this version?



Program received signal SIGFPE, Arithmetic exception.
0x001799df in _cairo_fixed_from_double (d=-95136.092880705997)
    at cairo-fixed.c:48
48          return (cairo_fixed_t) (d * 65536);
(gdb) where
#0  0x001799df in _cairo_fixed_from_double (d=-95136.092880705997)
    at cairo-fixed.c:48
#1  0x00183dd8 in _line_segs_intersect_ceil (l1=0x91be878, l2=0x91be890,
    y_ret=0x520c78) at cairo-traps.c:566
#2  0x00183fbf in _cairo_traps_tessellate_polygon (traps=0xbfeca630,
    poly=0x520c78, fill_rule=CAIRO_FILL_RULE_WINDING) at cairo-traps.c:689
#3  0x00181e91 in _cairo_pen_stroke_spline (pen=0xbfeca420, 
    tolerance=0.10000000000000001, traps=0xbfeca630) at cairo-pen.c:585
#4  0x001813f1 in _cairo_stroker_curve_to (closure=0xbfeca550, b=0xbfeca4e0,
    c=0xbfeca4e8, d=0xbfeca4f0) at cairo-path-stroke.c:756
#5  0x0017f542 in _cairo_path_fixed_interpret (path=0x0,
    dir=CAIRO_DIRECTION_FORWARD, move_to=0x180c80 <_cairo_stroker_move_to>,
    line_to=0x180cbc <_cairo_stroker_line_to>,
    curve_to=0x1811b8 <_cairo_stroker_curve_to>,
    close_path=0x18142c <_cairo_stroker_close_path>, closure=0xbfeca550)
    at cairo-path.c:510
#6  0x00181519 in _cairo_path_fixed_stroke_to_traps (path=0x91b26a8,
    gstate=0x91b6658, traps=0xbfeca630) at cairo-path-stroke.c:809
#7  0x0017ba3a in _cairo_gstate_stroke (gstate=0x91b6658, path=0x91b26a8)
    at cairo-gstate.c:761
#8  0x00176dab in *INT_cairo_stroke_preserve (cr=0x91b26a0) at cairo.c:1536
#9  0x00176d59 in cairo_stroke (cr=0x91b26a0) at cairo.c:1511
#10 0x002908a5 in cairogen_bezier (job=0x520c78, A=0x91b6770, n=7,
    arrow_at_start=0, arrow_at_end=0, filled=0) at gvrender_cairo.c:945

More information about the cairo mailing list