diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index df1bcbfb..255774e7 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -1717,6 +1717,11 @@ void mjCGeom::Compile(void) { size[2] = mjMAX(fabs(aabb[2]), fabs(aabb[5])); } + for (double s : size) { + if (std::isnan(s)) { + throw mjCError(this, "nan size in geom '%s' (id = %d)", name.c_str(), id); + } + } // compute aabb ComputeAABB(); diff --git a/test/user/user_objects_test.cc b/test/user/user_objects_test.cc index a2d7d6d0..2139638a 100644 --- a/test/user/user_objects_test.cc +++ b/test/user/user_objects_test.cc @@ -440,6 +440,27 @@ TEST_F(MjCGeomTest, IgnoreBadGeomOutsideInertiagrouprange) { mj_deleteModel(m); } +// ------------- test invalid size values -------------------------------------- + +TEST_F(MjCGeomTest, NanSize) { + // even if the caller ignores warnings, models shouldn't compile with NaN + // geom sizes + mju_user_warning = nullptr; + static constexpr char xml[] = R"( + + + + + + + + )"; + std::array error; + mjModel* model = LoadModelFromString(xml, error.data(), error.size()); + ASSERT_THAT(model, testing::IsNull()); + ASSERT_THAT(error.data(), HasSubstr("nan")); +} + // ------------- test height fields -------------------------------------------- using MjCHFieldTest = MujocoTest;