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;