{"record":{"id":"392f5e70a2dbeeda","repo":"dotnet/runtime","slug":"value-out-of-range","errorCode":null,"errorMessage":"value out of range","messagePattern":"value out of range","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/mono/browser/runtime/memory.ts","lineNumber":154,"sourceCode":"    receiveWorkerHeapViews();\n    Module.HEAP32[<any>offset >>> 2] = value;\n}\n\nexport function setI32 (offset: MemOffset, value: number): void {\n    assert_int_in_range(<any>value, -0x8000_0000, 0x7FFF_FFFF);\n    receiveWorkerHeapViews();\n    Module.HEAP32[<any>offset >>> 2] = value;\n}\n\nfunction autoThrowI52 (error: I52Error) {\n    if (error === I52Error.NONE)\n        return;\n\n    switch (error) {\n        case I52Error.NON_INTEGRAL:\n            throw new Error(\"value was not an integer\");\n        case I52Error.OUT_OF_RANGE:\n            throw new Error(\"value out of range\");\n        default:\n            throw new Error(\"unknown internal error\");\n    }\n}\n\n/**\n * Throws for values which are not 52 bit integer. See Number.isSafeInteger()\n */\nexport function setI52 (offset: MemOffset, value: number): void {\n    mono_check(Number.isSafeInteger(value), () => `Value is not a safe integer: ${value} (${typeof (value)})`);\n    receiveWorkerHeapViews();\n    const error = cwraps.mono_wasm_f64_to_i52(<any>offset, value);\n    autoThrowI52(error);\n}\n\n/**\n * Throws for values which are not 52 bit integer or are negative. See Number.isSafeInteger().\n */","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/dotnet/runtime/blob/290d5ab72cc1102813fbc0406fb186ceadabc340/src/mono/browser/runtime/memory.ts#L136-L172","documentation":"autoThrowI52 throws 'value out of range' when the native routine returns I52_ERROR_OUT_OF_RANGE: the value is outside the i52 range [-2^53+1, 2^53-1] or the u52 range [0, 2^53-1]. Reached via setI52/setU52 (and getI52/getU52 if the heap slot holds an out-of-range int64).","triggerScenarios":"Passing a Number larger than 9007199254740991 (2^53-1) or below -9007199254740991 to setI52, or a negative/>2^53-1 value to setU52.","commonSituations":"Marshaling large 64-bit-ish magnitudes as Number beyond the safe-integer range; passing a raw pointer or hash that exceeds 2^53; u52 path getting a negative value.","solutions":["Range-check before calling: i52 requires Number.isSafeInteger(value); u52 additionally requires value >= 0.","For values beyond 2^53-1, marshal as bigint via setI64Big, or as two 32-bit halves (setU32).","For u52, ensure the value is non-negative."],"exampleFix":"// before\nModule.setHeapI52(offset, 9.9e15); // > 2^53-1, throws\n// after\nModule.setHeapI64Big(offset, 9900000000000000n);","handlingStrategy":"validation","validationCode":"if (!Number.isSafeInteger(value)) throw new RangeError(`Value ${value} is outside the safe-integer (i52) range.`);\n// for u52 additionally:\nif (isU52 && value < 0) throw new RangeError('u52 requires a non-negative value.');","typeGuard":"function isSafeIntegerNumber(v: unknown): v is number { return typeof v === 'number' && Number.isSafeInteger(v); }","tryCatchPattern":null,"preventionTips":["Use Number.isSafeInteger to guard i52, and additionally require >= 0 for u52.","For magnitudes beyond 2^53-1, use bigint via setI64Big or split into two setU32 halves.","Do not pass raw pointers/hashes as Number if they may exceed 2^53-1."],"tags":["memory","types","integer","overflow","i52"],"analyzedSha":"290d5ab72cc1102813fbc0406fb186ceadabc340","analyzedAt":"2026-08-06T19:57:01.276Z","schemaVersion":2},"datasetVersion":"2026-08-06T23:17:07.152Z"}