You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When trying to run mars on aarch64, mars segfaults once ODE starts its simulation. The root cause is a misstated assertion in ode, but there is also a fault in mars itself.
The segfault happens when ode calls its dDebug function, which then calls whatever has been assigned to odes debug_function, which happens to be mars::sim::myDebugFunction. Since dDebug is marked noreturn, when it would try to return(which triggers undefined behavior), the compiler instead put in a call to dMessage(which happens to be the next function in the file), which then has an incorrect stack/parameter layout and causes the segfault later(char const *msg parameter is 1).
Since dDebug does not prevent returning if a debug_function is present, i conclude that the debug_function is supposed to not return, thus, mars::sim::myDebugFunction (and mars::sim::myErrorFunction) should not return.
The issue in ode-16 is that they assumed ~((atomicord32)0) equals 0xffffffff, while it does equal -1(atomicord32 is an int32_t in this case). Thus, dICHECK(nj < ~((atomicord32)0) / dJCB__MAX) always triggers.
When trying to run mars on aarch64, mars segfaults once ODE starts its simulation. The root cause is a misstated assertion in ode, but there is also a fault in mars itself.
The segfault happens when ode calls its
dDebug
function, which then calls whatever has been assigned to odesdebug_function
, which happens to bemars::sim::myDebugFunction
. SincedDebug
is markednoreturn
, when it would try to return(which triggers undefined behavior), the compiler instead put in a call to dMessage(which happens to be the next function in the file), which then has an incorrect stack/parameter layout and causes the segfault later(char const *msg
parameter is 1).Since
dDebug
does not prevent returning if adebug_function
is present, i conclude that thedebug_function
is supposed to not return, thus,mars::sim::myDebugFunction
(andmars::sim::myErrorFunction
) should not return.The issue in ode-16 is that they assumed ~((atomicord32)0) equals 0xffffffff, while it does equal -1(atomicord32 is an int32_t in this case). Thus,
dICHECK(nj < ~((atomicord32)0) / dJCB__MAX)
always triggers.Apart from that, runs great, if not very fast.
@malter
The text was updated successfully, but these errors were encountered: