ccdVec3PointTriDist2() divides by zero.

Issue #52 closed
Bram Stolk created an issue

Running with FP exceptions enabled, demo_convex will at some point cause a division by zero in the libccd code.

Debugger info:

Program received signal SIGFPE, Arithmetic exception.
─── Assembly ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
0x00005555555ec379 ccdVec3PointTriDist2+441 mulss  %xmm11,%xmm12
0x00005555555ec37e ccdVec3PointTriDist2+446 subss  %xmm12,%xmm2
0x00005555555ec383 ccdVec3PointTriDist2+451 movss  0x281e4(%rip),%xmm12        # 0x555555614570
0x00005555555ec38c ccdVec3PointTriDist2+460 divss  %xmm2,%xmm0
0x00005555555ec390 ccdVec3PointTriDist2+464 movaps %xmm0,%xmm13
0x00005555555ec394 ccdVec3PointTriDist2+468 andps  0x26274(%rip),%xmm13        # 0x555555612610
0x00005555555ec39c ccdVec3PointTriDist2+476 ucomiss %xmm13,%xmm12
─── Expressions ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
─── History ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
─── Memory ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
─── Registers ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   rax 0x00007fffffffc3f0    rbx 0x00007fffffffc520    rcx 0x00007fffffffc45c    rdx 0x00007fffffffc438    rsi 0x00007fffffffc414
   rdi 0x000055555583b988    rbp 0x00007fffffffc4e0    rsp 0x00007fffffffc328     r8 0x00007fffffffc520     r9 0x00007fffffffc52c
   r10 0x0000555555864e50    r11 0x0000000000000000    r12 0x00007fffffffc570    r13 0x00007fffffffc5b0    r14 0x00007fffffffc52c
   r15 0x0000000000000000    rip 0x00005555555ec38c eflags [ IF RF ]              cs 0x00000033             ss 0x0000002b        
    ds 0x00000000             es 0x00000000             fs 0x00000000             gs 0x00000000        
─── Source ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
166     w = ccdVec3Dot(&d2, &d2);
167     p = ccdVec3Dot(&a, &d1);
168     q = ccdVec3Dot(&a, &d2);
169     r = ccdVec3Dot(&d1, &d2);
170 
171     s = (q * r - w * p) / (w * v - r * r);
172     t = (-s * r - q) / w;
173 
174     if ((ccdIsZero(s) || s > CCD_ZERO)
175             && (ccdEq(s, CCD_ONE) || s < CCD_ONE)
176             && (ccdIsZero(t) || t > CCD_ZERO)
─── Stack ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x00005555555ec38c in ccdVec3PointTriDist2+460 at vec3.c:171
arg P = 0x55555583b988 <__ccd_vec3_origin>
arg x0 = 0x7fffffffc414
arg B = 0x7fffffffc438
arg C = 0x7fffffffc45c
arg witness = 0x7fffffffc520
[1] from 0x00005555555ea94f in findPenetr at mpr.c:350
arg pos = <optimized out>
arg pdir = <optimized out>
arg depth = <optimized out>
arg portal = <optimized out>
arg ccd = <optimized out>
arg obj2 = <optimized out>
arg obj1 = <optimized out>
[+]
─── Threads ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[1] id 13589 name demo_convex from 0x00005555555ec38c in ccdVec3PointTriDist2+460 at vec3.c:171
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
ccdVec3PointTriDist2 (P=0x55555583b988 <__ccd_vec3_origin>, x0=x0@entry=0x7fffffffc414, B=B@entry=0x7fffffffc438, C=C@entry=0x7fffffffc45c, witness=witness@entry=0x7fffffffc520) at vec3.c:171
171     s = (q * r - w * p) / (w * v - r * r);

Call stack:

#0  ccdVec3PointTriDist2 (P=0x55555583b988 <__ccd_vec3_origin>, x0=x0@entry=0x7fffffffc414, B=B@entry=0x7fffffffc438, C=C@entry=0x7fffffffc45c, witness=witness@entry=0x7fffffffc520) at vec3.c:171
#1  0x00005555555ea94f in findPenetr (pos=<optimized out>, pdir=<optimized out>, depth=<optimized out>, portal=<optimized out>, ccd=<optimized out>, obj2=<optimized out>, obj1=<optimized out>) at mpr.c:350
#2  ccdMPRPenetration (obj1=obj1@entry=0x7fffffffc570, obj2=obj2@entry=0x7fffffffc5b0, ccd=ccd@entry=0x7fffffffc4e0, depth=depth@entry=0x7fffffffc4dc, dir=dir@entry=0x7fffffffc520, pos=pos@entry=0x7fffffffc52c) at mpr.c:152
#3  0x000055555559b744 in ccdCollide (o1=o1@entry=0x555555855380, o2=o2@entry=0x55555585eba0, flags=flags@entry=32, contact=contact@entry=0x7fffffffc670, obj1=obj1@entry=0x7fffffffc570, supp1=supp1@entry=0x55555559c2d0 <ccdSupportConvex(void const*, ccd_vec3_t const*, ccd_vec3_t*)>, obj2=0x7fffffffc5b0, supp2=0x55555559c2d0 <ccdSupportConvex(void const*, ccd_vec3_t const*, ccd_vec3_t*)>, skip=<optimized out>, cen2=0x55555559b0f0 <ccdCenter(void const*, ccd_vec3_t*)>, cen1=0x55555559b0f0 <ccdCenter(void const*, ccd_vec3_t*)>) at collision_libccd.cpp:339
#4  0x000055555559d1bb in ccdCollide (skip=<optimized out>, cen2=0x55555559b0f0 <ccdCenter(void const*, ccd_vec3_t*)>, supp2=0x55555559c2d0 <ccdSupportConvex(void const*, ccd_vec3_t const*, ccd_vec3_t*)>, obj2=0x7fffffffc5b0, cen1=0x55555559b0f0 <ccdCenter(void const*, ccd_vec3_t*)>, supp1=0x55555559c2d0 <ccdSupportConvex(void const*, ccd_vec3_t const*, ccd_vec3_t*)>, obj1=0x7fffffffc570, contact=0x7fffffffc670, flags=32, o2=0x55555585eba0, o1=0x555555855380) at collision_libccd.cpp:319
#5  dCollideConvexConvexCCD (o1=0x555555855380, o2=0x55555585eba0, flags=32, contact=0x7fffffffc670, skip=<optimized out>) at collision_libccd.cpp:457
#6  0x000055555555e369 in nearCallback (o1=<optimized out>, o2=<optimized out>, data=<optimized out>) at demo_convex.cpp:88
#7  0x00005555555697e9 in collideAABBs (callback=<optimized out>, data=0x0, g2=0x55555585eba0, g1=0x555555855380) at collision_space_internal.h:77
#8  dxHashSpace::collide (this=0x55555584f9e0, data=0x0, callback=0x55555555e450 <nearCallback(void*, dGeomID, dGeomID)>) at collision_space.cpp:569
#9  0x000055555555ddee in simLoop (pause=<optimized out>) at demo_convex.cpp:230
#10 0x00005555555629e6 in processDrawFrame (frame=0x7fffffffdc20, fn=<optimized out>) at x11.cpp:337
#11 0x000055555556306b in dsPlatformSimLoop (window_width=window_width@entry=1920, window_height=window_height@entry=1080, fn=fn@entry=0x7fffffffdeb0, initial_pause=initial_pause@entry=0) at x11.cpp:416
#12 0x000055555556155f in dsSimulationLoop (argc=1, argv=0x7fffffffe058, window_width=1920, window_height=1080, fn=0x7fffffffdeb0) at drawstuff.cpp:1291
#13 0x000055555555d970 in main (argc=1, argv=0x7fffffffe058) at demo_convex.cpp:429

Comments (4)

  1. Bram Stolk reporter

    Arguments to the function were:

    >>> print *P
    $3 = {
      v = {[0] = 0, [1] = 0, [2] = 0}
    }
    >>> print *x0
    $4 = {
      v = {[0] = -0.0691090226, [1] = 0.268908083, [2] = 5.84125519e-06}
    }
    >>> print *B
    $5 = {
      v = {[0] = 0.0178598166, [1] = -0.0699187815, [2] = -4.90099192e-05}
    }
    >>> print *C
    $6 = {
      v = {[0] = 0.0610703528, [1] = -0.238080174, [2] = 2.72244215e-05}
    }
    >>> print *witness
    $7 = {
      v = {[0] = 1.84089345e+13, [1] = 3.0611365e-41, [2] = 1.49602446e+13}
    }
    
  2. Log in to comment