diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index e64d836f..bdedbaab 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -1334,11 +1334,11 @@ static void _resetData(const mjModel* m, mjData* d, unsigned char debug_value) { #endif #ifdef MEMORY_SANITIZER - // Tell msan to treat the entire buffer as uninitialized + // under MSAN, mark the entire buffer as uninitialized __msan_allocated_memory(d->buffer, d->nbuffer); #endif - // zero out arrays that are not affected by mj_forward + // zero out user-settable state and input arrays (MSAN: mark as initialized) mju_zero(d->qpos, m->nq); mju_zero(d->qvel, m->nv); mju_zero(d->act, m->na); @@ -1346,11 +1346,10 @@ static void _resetData(const mjModel* m, mjData* d, unsigned char debug_value) { for (int i=0; i < m->neq; i++) d->eq_active[i] = m->eq_active0[i]; mju_zero(d->qfrc_applied, m->nv); mju_zero(d->xfrc_applied, 6*m->nbody); - mju_zero(d->qacc, m->nv); + mju_zero(d->qacc, m->nv); // input to inverse dynamics mju_zero(d->qacc_warmstart, m->nv); mju_zero(d->act_dot, m->na); mju_zero(d->userdata, m->nuserdata); - mju_zero(d->sensordata, m->nsensordata); mju_zero(d->mocap_pos, 3*m->nmocap); mju_zero(d->mocap_quat, 4*m->nmocap); @@ -1359,7 +1358,7 @@ static void _resetData(const mjModel* m, mjData* d, unsigned char debug_value) { // copy qpos0 from model if (m->qpos0) { - memcpy(d->qpos, m->qpos0, m->nq*sizeof(mjtNum)); + mju_copy(d->qpos, m->qpos0, m->nq); } // set mocap_pos/quat = body_pos/quat for mocap bodies diff --git a/src/engine/engine_sensor.c b/src/engine/engine_sensor.c index 42f9873c..c218a1dc 100644 --- a/src/engine/engine_sensor.c +++ b/src/engine/engine_sensor.c @@ -647,6 +647,8 @@ void mj_sensorPos(const mjModel* m, mjData* d) { break; case mjSENS_USER: // user + // clear result, compute later + mju_zero(d->sensordata + adr, m->sensor_dim[i]); nusersensor++; break; @@ -822,6 +824,8 @@ void mj_sensorVel(const mjModel* m, mjData* d) { break; case mjSENS_USER: // user + // clear result, compute later + mju_zero(d->sensordata + adr, m->sensor_dim[i]); nusersensor++; break; @@ -1346,6 +1350,8 @@ void mj_sensorAcc(const mjModel* m, mjData* d) { break; case mjSENS_USER: // user + // clear result, compute later + mju_zero(d->sensordata + adr, m->sensor_dim[i]); nusersensor++; break; diff --git a/test/engine/engine_sensor_test.cc b/test/engine/engine_sensor_test.cc index c5607223..ab43f1e4 100644 --- a/test/engine/engine_sensor_test.cc +++ b/test/engine/engine_sensor_test.cc @@ -69,7 +69,6 @@ using SensorTest = MujocoTest; // --------------------- test sensor disableflag ------------------------------ -// hand-picked positions and orientations for simple expected values TEST_F(SensorTest, DisableSensors) { constexpr char xml[] = R"( @@ -83,7 +82,8 @@ TEST_F(SensorTest, DisableSensors) { ASSERT_THAT(model, NotNull()) << error; mjData* data = mj_makeData(model); - // before calling anything, check that sensors are initialised to 0 + // call mj_forward, expect clock to report 0 + mj_forward(model, data); EXPECT_EQ(data->sensordata[0], 0.0); // call mj_step, mj_step1, expect clock to be incremented by timestep