ccdVec3PointTriDist2() divides by zero.
Issue #52
closed
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)
-
reporter -
reporter -
assigned issue to
I've reproduced this with the development version of libccd, and reported it as an issue on libccd's github.
-
assigned issue to
-
reporter This was fixed up stream:
https://github.com/danfis/libccd/commit/7931e764a19ef6b21b443376c699bbc9c6d4fba8
If you build ODE with system libccd, this no longer happens.
-
reporter - changed status to closed
Fixed up-stream in libccd. Use system libccd when building ode.
- Log in to comment
Arguments to the function were: