Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

WilliamVenner/null_fn

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

crates.io

null_fn

A proc attribute macro that allows for creating null function pointers in statics.

This crate is unsafe and easy to cause UB with, Option<fn()> is FFI safe and may be a more appropriate alternative if you value type safety.

Example

static mut UTIL_PlayerByUserId: unsafe extern "C" fn(userid: i32) -> *mut c_void = unsafe { std::mem::transmute::<*const (), _>(std::ptr::null()) }; // error[E0080]: it is undefined behavior to use this value

#[null_fn]
static mut UTIL_PlayerByUserId: unsafe extern "C" fn(userid: i32) -> *mut c_void = std::ptr::null(); // works!

fn main() {
    unsafe {
        UTIL_PlayerByUserId(20); // This would panic, as we have not initialized the function yet. By default the function is set to a small stub function that panics when called.

        UTIL_PlayerByUserId = /* magically find the pointer to the function; sigscan? */;
		// Setting the function's pointer to a null pointer is UB in Rust.
		// https://doc.rust-lang.org/nomicon/ffi.html#the-nullable-pointer-optimization

        let player = UTIL_PlayerByUserId(20); // Now that we set the function pointer, we can call the function without panicking, assuming we found the pointer correctly.

		/* do something with our player! */
    }
}

About

✨ A proc attribute macro that allows for creating null function pointers in statics

Topics

Resources

Stars

Watchers

Forks

Used by

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.