算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
rust-ffi-safe-wrappers【设计与创意】Design and review Rust FFI boundaries that keep raw declarations isolated behind safe ownership, lifetime, error, and cleanup wrappers. Use when writing, refactoring, or reviewing unsafe extern blocks, C ABI wrappers, repr(C) types, CString, CStr, raw handles, Drop cleanup, bindgen, cbindgen, or panic-safe foreign boundaries.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Use this skill to wrap foreign interfaces in Rust APIs that make ownership, lifetimes, errors, and cleanup explicit. FFI code should be unsafe at the raw boundary and safe for normal Rust callers.
unsafe extern
bindings in a small private module.unsafe extern "C" blocks for modern Rust, especially Rust 2024 edition
code. Leave safety-conditional items unqualified or explicitly unsafe, and
mark individual extern items safe only when calling them is safe for all
Rust inputs.#[repr(C)] for structs and enums that cross the ABI boundary. Do not
expose Rust-only layout types across C.CString for owned nul-terminated strings sent to C and CStr for
borrowed C strings. Never treat arbitrary C memory as Rust-owned.Drop cleanup using
the matching foreign deallocator.extern "C" boundaries. Catch panics or
expose an ABI that permits unwinding only when deliberately using
"C-unwind".Read references/ffi-boundary-patterns.md before adding or reviewing FFI
bindings.
core::ffi or std::ffi C types over guessing integer sizes.Result at the wrapper boundary.Option<NonNull<T>> internally when useful,
but expose safe Rust types to callers.PhantomData when the compiler cannot see the relationship.OnceLock, LazyLock, or
Once when the foreign library requires process-wide setup.bindgen for large or changing C headers and cbindgen when exporting a
Rust API to C, but still review generated unsafe signatures.unsafe extern "C" {
pub fn library_open(path: *const core::ffi::c_char) -> *mut RawHandle;
pub fn library_close(handle: *mut RawHandle);
// Mark an item `safe` only when calling it is valid for all Rust inputs:
// pub safe fn library_version() -> core::ffi::c_int;
}
// SAFETY: This exported symbol name is unique for this library.
#[unsafe(no_mangle)]
pub extern "C" fn plugin_version() -> core::ffi::c_int {
1
}
Unsafe attributes such as no_mangle, export_name, and link_section need
the unsafe(...) form in Rust 2024 edition code. Include a SAFETY comment
where symbol uniqueness or linker behavior is part of the contract.