{"record":{"id":"889493ff38340c55","repo":"napi-rs/napi-rs","slug":"invalidarg-referenced-ptr-is-null","errorCode":"InvalidArg","errorMessage":"referenced ptr is null","messagePattern":"referenced ptr is null","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/backend/src/codegen/fn.rs","lineNumber":1080,"sourceCode":"          }\n        }\n      }\n    }\n    Type::Reference(TypeReference {\n      lifetime: Some(lt), ..\n    }) => {\n      *lt = syn::Lifetime::new(\"'_\", Span::call_site());\n    }\n    _ => {}\n  }\n  Ok(())\n}\n\nfn make_ref(input: TokenStream) -> TokenStream {\n  quote! {\n    _args_array[_arg_write_index] = _make_ref(\n      ::std::ptr::NonNull::new(#input)\n        .ok_or_else(|| napi::Error::new(napi::Status::InvalidArg, \"referenced ptr is null\".to_owned()))?\n    )?;\n    _arg_write_index += 1;\n  }\n}\n\nstruct ArgConversions {\n  pub args: Vec<TokenStream>,\n  pub arg_conversions: Vec<TokenStream>,\n  pub this_conversions: Vec<TokenStream>,\n  pub receiver_unwrap: TokenStream,\n  pub receiver_dependent_conversions: Vec<TokenStream>,\n  pub receiver_conversion: TokenStream,\n  pub refs: Vec<TokenStream>,\n  pub mut_ref_spans: Vec<Span>,\n  pub unsafe_: bool,\n}\n\n#[derive(Debug, PartialEq, Eq)]","sourceCodeStart":1062,"sourceCodeEnd":1098,"githubUrl":"https://github.com/napi-rs/napi-rs/blob/39bd1205e480a453a2da2601a760bde5a71ed016/crates/backend/src/codegen/fn.rs#L1062-L1098","documentation":"This is a codegen-injected guard: when generated #[napi] function argument conversion needs to take a reference to an argument (make_ref), it checks the raw pointer for null and throws InvalidArg 'referenced ptr is null' if it is null. Hitting it means a required reference argument arrived as a null raw pointer, which the generated code refuses to reference.","triggerScenarios":"Calling a generated napi function whose argument conversion uses make_ref with a null/undefined or otherwise null-backed value where a non-null reference is required (e.g. passing null for an argument typed as an object/class reference in a generated binding).","commonSituations":"Calling a native addon function with null/undefined for an argument expected to be a real object; FFI-level misuse where a pointer field was never populated; mismatches between generated bindings and the JS values passed.","solutions":["Pass a real, non-null value for the argument instead of null/undefined","Check the generated .d.ts signature and supply all required reference arguments","If the argument is optional in your design, change the Rust signature to Option<T> so null is handled","Regenerate bindings if the addon was rebuilt with a different signature"],"exampleFix":"// before\nmod.doWork(null) // ptr is null -> InvalidArg\n// after\nmod.doWork({ id: 1 })","handlingStrategy":"validation","validationCode":"function requireRef(v, name) { if (v === null || v === undefined) throw new TypeError(name + ' must be a non-null object'); return v }","typeGuard":"const isNonNullObject = (v) => v !== null && (typeof v === 'object' || typeof v === 'function')","tryCatchPattern":"try {\n  addon.fn(arg)\n} catch (e) {\n  if (e.code === 'InvalidArg' && /referenced ptr is null/.test(e.message)) {\n    throw new TypeError('arg must not be null/undefined')\n  }\n  throw e\n}","preventionTips":["Never pass null/undefined where the generated .d.ts shows a required reference type","Model optional native arguments as Option<T> in Rust so null is legal","Regenerate and review .d.ts signatures after changing Rust function signatures"],"tags":["codegen","null-pointer","invalid-argument","napi"],"backgroundTag":"null-argument","analyzedSha":"39bd1205e480a453a2da2601a760bde5a71ed016","analyzedAt":"2026-09-13T20:31:47.814Z","contentChangedAt":"2026-09-13T20:31:47.814Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}