Change mjtSize from uint64_t to int64_t.

This change makes `mjtSize` a signed, rather than unsigned 64-bit integer. While sizes are non-negative, the type promotion rules for unsigned integers can lead to unituitive downstream bugs, and 8 billion terabytes are enough bytes.

PiperOrigin-RevId: 834292964
Change-Id: Iea9c47c2a5d80fde63851a543d59ed0549db0f01
This commit is contained in:
Yuval Tassa
2025-11-19 07:55:00 -08:00
committed by Copybara-Service
parent 49394d57d9
commit 86a77ff8eb
5 changed files with 149 additions and 143 deletions
+1 -1
View File
@@ -100,7 +100,7 @@ Size type used to represent buffer sizes.
.. code-block:: C .. code-block:: C
typedef uint64_t mjtSize; typedef int64_t mjtSize;
.. _tyEnums: .. _tyEnums:
+5 -1
View File
@@ -29,7 +29,11 @@ General
- ``sidesite -> MjsSite|None`` - ``sidesite -> MjsSite|None``
- ``coef -> real`` - ``coef -> real``
- ``divisor -> real`` - ``divisor -> real``
- Non-breaking API change: :ref:`mj_sizeModel` now returns an :ref:`mjtSize` rather than an ``int``.
- Non-breaking ABI changes:
- :ref:`mjtSize` is now defined as ``int64_t`` rather than ``uint64_t`` to avoid future type-promotion bugs.
- :ref:`mj_sizeModel` now returns an :ref:`mjtSize` rather than an ``int``.
MJX MJX
^^^ ^^^
+4 -3
View File
@@ -17,6 +17,7 @@
#include <stdint.h> #include <stdint.h>
//---------------------------------- floating-point definition ------------------------------------- //---------------------------------- floating-point definition -------------------------------------
// floating point data type and minval // floating point data type and minval
@@ -30,15 +31,15 @@
//-------------------------------------- byte definition ------------------------------------------- //---------------------------------- byte definition -----------------------------------------------
typedef unsigned char mjtByte; // used for true/false typedef unsigned char mjtByte; // used for true/false
//-------------------------------------- size definition ------------------------------------------- //---------------------------------- size definition -----------------------------------------------
typedef uint64_t mjtSize; // used for buffer sizes typedef int64_t mjtSize; // used for buffer sizes
+4 -3
View File
@@ -14,6 +14,7 @@
#include "engine/engine_print.h" #include "engine/engine_print.h"
#include <inttypes.h> // IWYU pragma: keep
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <stdio.h> #include <stdio.h>
@@ -41,7 +42,7 @@
#define FLOAT_FORMAT "% -9.2g" #define FLOAT_FORMAT "% -9.2g"
#define FLOAT_FORMAT_MAX_LEN 20 #define FLOAT_FORMAT_MAX_LEN 20
#define INT_FORMAT " %d" #define INT_FORMAT " %d"
#define SIZE_T_FORMAT " %zu" #define SIZE_FORMAT " %" PRId64
#define NAME_FORMAT "%-21s" #define NAME_FORMAT "%-21s"
@@ -543,7 +544,7 @@ void mj_printFormattedModel(const mjModel* m, const char* filename, const char*
if (m->name) { \ if (m->name) { \
const char* format = _Generic( \ const char* format = _Generic( \
m->name, \ m->name, \
size_t : SIZE_T_FORMAT, \ mjtSize : SIZE_FORMAT, \
default : INT_FORMAT); \ default : INT_FORMAT); \
fprintf(fp, NAME_FORMAT, " " #name); \ fprintf(fp, NAME_FORMAT, " " #name); \
fprintf(fp, format, m->name); \ fprintf(fp, format, m->name); \
@@ -1146,7 +1147,7 @@ void mj_printFormattedData(const mjModel* m, const mjData* d, const char* filena
const char* format = _Generic( \ const char* format = _Generic( \
d->name, \ d->name, \
int : INT_FORMAT, \ int : INT_FORMAT, \
size_t : SIZE_T_FORMAT, \ mjtSize : SIZE_FORMAT, \
default : NULL); \ default : NULL); \
if (format) { \ if (format) { \
fprintf(fp, " "); \ fprintf(fp, " "); \
+135 -135
View File
@@ -740,142 +740,142 @@ public unsafe struct mjSolverStat_ {
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]
public unsafe struct mjData_ { public unsafe struct mjData_ {
public UInt64 narena; public Int64 narena;
public UInt64 nbuffer; public Int64 nbuffer;
public int nplugin; public int nplugin;
public UIntPtr pstack; public UIntPtr pstack;
public UIntPtr pbase; public UIntPtr pbase;
public UIntPtr parena; public UIntPtr parena;
public UInt64 maxuse_stack; public Int64 maxuse_stack;
public UInt64 maxuse_threadstack0; public Int64 maxuse_threadstack0;
public UInt64 maxuse_threadstack1; public Int64 maxuse_threadstack1;
public UInt64 maxuse_threadstack2; public Int64 maxuse_threadstack2;
public UInt64 maxuse_threadstack3; public Int64 maxuse_threadstack3;
public UInt64 maxuse_threadstack4; public Int64 maxuse_threadstack4;
public UInt64 maxuse_threadstack5; public Int64 maxuse_threadstack5;
public UInt64 maxuse_threadstack6; public Int64 maxuse_threadstack6;
public UInt64 maxuse_threadstack7; public Int64 maxuse_threadstack7;
public UInt64 maxuse_threadstack8; public Int64 maxuse_threadstack8;
public UInt64 maxuse_threadstack9; public Int64 maxuse_threadstack9;
public UInt64 maxuse_threadstack10; public Int64 maxuse_threadstack10;
public UInt64 maxuse_threadstack11; public Int64 maxuse_threadstack11;
public UInt64 maxuse_threadstack12; public Int64 maxuse_threadstack12;
public UInt64 maxuse_threadstack13; public Int64 maxuse_threadstack13;
public UInt64 maxuse_threadstack14; public Int64 maxuse_threadstack14;
public UInt64 maxuse_threadstack15; public Int64 maxuse_threadstack15;
public UInt64 maxuse_threadstack16; public Int64 maxuse_threadstack16;
public UInt64 maxuse_threadstack17; public Int64 maxuse_threadstack17;
public UInt64 maxuse_threadstack18; public Int64 maxuse_threadstack18;
public UInt64 maxuse_threadstack19; public Int64 maxuse_threadstack19;
public UInt64 maxuse_threadstack20; public Int64 maxuse_threadstack20;
public UInt64 maxuse_threadstack21; public Int64 maxuse_threadstack21;
public UInt64 maxuse_threadstack22; public Int64 maxuse_threadstack22;
public UInt64 maxuse_threadstack23; public Int64 maxuse_threadstack23;
public UInt64 maxuse_threadstack24; public Int64 maxuse_threadstack24;
public UInt64 maxuse_threadstack25; public Int64 maxuse_threadstack25;
public UInt64 maxuse_threadstack26; public Int64 maxuse_threadstack26;
public UInt64 maxuse_threadstack27; public Int64 maxuse_threadstack27;
public UInt64 maxuse_threadstack28; public Int64 maxuse_threadstack28;
public UInt64 maxuse_threadstack29; public Int64 maxuse_threadstack29;
public UInt64 maxuse_threadstack30; public Int64 maxuse_threadstack30;
public UInt64 maxuse_threadstack31; public Int64 maxuse_threadstack31;
public UInt64 maxuse_threadstack32; public Int64 maxuse_threadstack32;
public UInt64 maxuse_threadstack33; public Int64 maxuse_threadstack33;
public UInt64 maxuse_threadstack34; public Int64 maxuse_threadstack34;
public UInt64 maxuse_threadstack35; public Int64 maxuse_threadstack35;
public UInt64 maxuse_threadstack36; public Int64 maxuse_threadstack36;
public UInt64 maxuse_threadstack37; public Int64 maxuse_threadstack37;
public UInt64 maxuse_threadstack38; public Int64 maxuse_threadstack38;
public UInt64 maxuse_threadstack39; public Int64 maxuse_threadstack39;
public UInt64 maxuse_threadstack40; public Int64 maxuse_threadstack40;
public UInt64 maxuse_threadstack41; public Int64 maxuse_threadstack41;
public UInt64 maxuse_threadstack42; public Int64 maxuse_threadstack42;
public UInt64 maxuse_threadstack43; public Int64 maxuse_threadstack43;
public UInt64 maxuse_threadstack44; public Int64 maxuse_threadstack44;
public UInt64 maxuse_threadstack45; public Int64 maxuse_threadstack45;
public UInt64 maxuse_threadstack46; public Int64 maxuse_threadstack46;
public UInt64 maxuse_threadstack47; public Int64 maxuse_threadstack47;
public UInt64 maxuse_threadstack48; public Int64 maxuse_threadstack48;
public UInt64 maxuse_threadstack49; public Int64 maxuse_threadstack49;
public UInt64 maxuse_threadstack50; public Int64 maxuse_threadstack50;
public UInt64 maxuse_threadstack51; public Int64 maxuse_threadstack51;
public UInt64 maxuse_threadstack52; public Int64 maxuse_threadstack52;
public UInt64 maxuse_threadstack53; public Int64 maxuse_threadstack53;
public UInt64 maxuse_threadstack54; public Int64 maxuse_threadstack54;
public UInt64 maxuse_threadstack55; public Int64 maxuse_threadstack55;
public UInt64 maxuse_threadstack56; public Int64 maxuse_threadstack56;
public UInt64 maxuse_threadstack57; public Int64 maxuse_threadstack57;
public UInt64 maxuse_threadstack58; public Int64 maxuse_threadstack58;
public UInt64 maxuse_threadstack59; public Int64 maxuse_threadstack59;
public UInt64 maxuse_threadstack60; public Int64 maxuse_threadstack60;
public UInt64 maxuse_threadstack61; public Int64 maxuse_threadstack61;
public UInt64 maxuse_threadstack62; public Int64 maxuse_threadstack62;
public UInt64 maxuse_threadstack63; public Int64 maxuse_threadstack63;
public UInt64 maxuse_threadstack64; public Int64 maxuse_threadstack64;
public UInt64 maxuse_threadstack65; public Int64 maxuse_threadstack65;
public UInt64 maxuse_threadstack66; public Int64 maxuse_threadstack66;
public UInt64 maxuse_threadstack67; public Int64 maxuse_threadstack67;
public UInt64 maxuse_threadstack68; public Int64 maxuse_threadstack68;
public UInt64 maxuse_threadstack69; public Int64 maxuse_threadstack69;
public UInt64 maxuse_threadstack70; public Int64 maxuse_threadstack70;
public UInt64 maxuse_threadstack71; public Int64 maxuse_threadstack71;
public UInt64 maxuse_threadstack72; public Int64 maxuse_threadstack72;
public UInt64 maxuse_threadstack73; public Int64 maxuse_threadstack73;
public UInt64 maxuse_threadstack74; public Int64 maxuse_threadstack74;
public UInt64 maxuse_threadstack75; public Int64 maxuse_threadstack75;
public UInt64 maxuse_threadstack76; public Int64 maxuse_threadstack76;
public UInt64 maxuse_threadstack77; public Int64 maxuse_threadstack77;
public UInt64 maxuse_threadstack78; public Int64 maxuse_threadstack78;
public UInt64 maxuse_threadstack79; public Int64 maxuse_threadstack79;
public UInt64 maxuse_threadstack80; public Int64 maxuse_threadstack80;
public UInt64 maxuse_threadstack81; public Int64 maxuse_threadstack81;
public UInt64 maxuse_threadstack82; public Int64 maxuse_threadstack82;
public UInt64 maxuse_threadstack83; public Int64 maxuse_threadstack83;
public UInt64 maxuse_threadstack84; public Int64 maxuse_threadstack84;
public UInt64 maxuse_threadstack85; public Int64 maxuse_threadstack85;
public UInt64 maxuse_threadstack86; public Int64 maxuse_threadstack86;
public UInt64 maxuse_threadstack87; public Int64 maxuse_threadstack87;
public UInt64 maxuse_threadstack88; public Int64 maxuse_threadstack88;
public UInt64 maxuse_threadstack89; public Int64 maxuse_threadstack89;
public UInt64 maxuse_threadstack90; public Int64 maxuse_threadstack90;
public UInt64 maxuse_threadstack91; public Int64 maxuse_threadstack91;
public UInt64 maxuse_threadstack92; public Int64 maxuse_threadstack92;
public UInt64 maxuse_threadstack93; public Int64 maxuse_threadstack93;
public UInt64 maxuse_threadstack94; public Int64 maxuse_threadstack94;
public UInt64 maxuse_threadstack95; public Int64 maxuse_threadstack95;
public UInt64 maxuse_threadstack96; public Int64 maxuse_threadstack96;
public UInt64 maxuse_threadstack97; public Int64 maxuse_threadstack97;
public UInt64 maxuse_threadstack98; public Int64 maxuse_threadstack98;
public UInt64 maxuse_threadstack99; public Int64 maxuse_threadstack99;
public UInt64 maxuse_threadstack100; public Int64 maxuse_threadstack100;
public UInt64 maxuse_threadstack101; public Int64 maxuse_threadstack101;
public UInt64 maxuse_threadstack102; public Int64 maxuse_threadstack102;
public UInt64 maxuse_threadstack103; public Int64 maxuse_threadstack103;
public UInt64 maxuse_threadstack104; public Int64 maxuse_threadstack104;
public UInt64 maxuse_threadstack105; public Int64 maxuse_threadstack105;
public UInt64 maxuse_threadstack106; public Int64 maxuse_threadstack106;
public UInt64 maxuse_threadstack107; public Int64 maxuse_threadstack107;
public UInt64 maxuse_threadstack108; public Int64 maxuse_threadstack108;
public UInt64 maxuse_threadstack109; public Int64 maxuse_threadstack109;
public UInt64 maxuse_threadstack110; public Int64 maxuse_threadstack110;
public UInt64 maxuse_threadstack111; public Int64 maxuse_threadstack111;
public UInt64 maxuse_threadstack112; public Int64 maxuse_threadstack112;
public UInt64 maxuse_threadstack113; public Int64 maxuse_threadstack113;
public UInt64 maxuse_threadstack114; public Int64 maxuse_threadstack114;
public UInt64 maxuse_threadstack115; public Int64 maxuse_threadstack115;
public UInt64 maxuse_threadstack116; public Int64 maxuse_threadstack116;
public UInt64 maxuse_threadstack117; public Int64 maxuse_threadstack117;
public UInt64 maxuse_threadstack118; public Int64 maxuse_threadstack118;
public UInt64 maxuse_threadstack119; public Int64 maxuse_threadstack119;
public UInt64 maxuse_threadstack120; public Int64 maxuse_threadstack120;
public UInt64 maxuse_threadstack121; public Int64 maxuse_threadstack121;
public UInt64 maxuse_threadstack122; public Int64 maxuse_threadstack122;
public UInt64 maxuse_threadstack123; public Int64 maxuse_threadstack123;
public UInt64 maxuse_threadstack124; public Int64 maxuse_threadstack124;
public UInt64 maxuse_threadstack125; public Int64 maxuse_threadstack125;
public UInt64 maxuse_threadstack126; public Int64 maxuse_threadstack126;
public UInt64 maxuse_threadstack127; public Int64 maxuse_threadstack127;
public UInt64 maxuse_arena; public Int64 maxuse_arena;
public int maxuse_con; public int maxuse_con;
public int maxuse_efc; public int maxuse_efc;
public mjSolverStat_ solver0; public mjSolverStat_ solver0;
@@ -5349,8 +5349,8 @@ public unsafe struct mjModel_ {
public int nuserdata; public int nuserdata;
public int nsensordata; public int nsensordata;
public int npluginstate; public int npluginstate;
public UInt64 narena; public Int64 narena;
public UInt64 nbuffer; public Int64 nbuffer;
public mjOption_ opt; public mjOption_ opt;
public mjVisual_ vis; public mjVisual_ vis;
public mjStatistic_ stat; public mjStatistic_ stat;
@@ -6448,7 +6448,7 @@ public static unsafe extern mjModel_* mj_loadModel([MarshalAs(UnmanagedType.LPSt
public static unsafe extern void mj_deleteModel(mjModel_* m); public static unsafe extern void mj_deleteModel(mjModel_* m);
[DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)] [DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)]
public static unsafe extern UInt64 mj_sizeModel(mjModel_* m); public static unsafe extern Int64 mj_sizeModel(mjModel_* m);
[DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)] [DllImport("mujoco", CallingConvention = CallingConvention.Cdecl)]
public static unsafe extern mjData_* mj_makeData(mjModel_* m); public static unsafe extern mjData_* mj_makeData(mjModel_* m);