#格式化字符串 #printf #安全包装 #c #no-std

无std printf-wrap

提供用于安全封装具有printf(3)样式格式字符串和可变参数的C函数的类型和函数

3个不稳定版本

0.2.1 2023年7月25日
0.2.0 2022年9月28日
0.1.0 2022年8月3日

108FFI

每月下载24

MIT/Apache

54KB
996

printf-wrap

Crates.io docs.rs

printf-wrap是一个Rust crate,包含类型,帮助开发者编写使用printf(3)样式格式字符串和可变参数的安全包装C函数。特别是,PrintfFmt<(T_1, T_2, ..., T_N)>是围绕一个以null终止的字符串的包装器,保证它是用于类型为T_1T_2、…、T_N的N个参数的有效的格式字符串,当参数通过PrintfArgument::as_c_val()方法映射时。

以下示例展示了使用两个参数调用printf的安全包装,以及它的使用。

use printf_wrap::{PrintfFmt, PrintfArgument};
use libc::{c_int, printf};

/// Safe wrapper for calling printf with two value arguments.
pub fn printf_with_2_args<T, U>(fmt: PrintfFmt<(T, U)>, arg1: T, arg2: U) -> c_int
where
    T: PrintfArgument,
    U: PrintfArgument,
{
    unsafe { printf(fmt.as_ptr(), arg1.as_c_val(), arg2.as_c_val()) }
}

const MY_FORMAT_STRING: PrintfFmt<(u32, i32)> =
    PrintfFmt::new_or_panic("unsigned = %u, signed = %d\0");

fn main() {
    printf_with_2_args(MY_FORMAT_STRING, 42, -7);
}

在示例中,MY_FORMAT_STRING被确定在编译时是一个有效的格式字符串,用于(u32, i32)类型的参数,没有任何运行时开销。通过一些宏魔法,可以轻松生成不同数量的后格式参数的包装器,而printf-wrap则处理验证和将值转换为与C兼容的等效值的转换。

特性

libc – 启用与 C 类型 size_tintmax_tptrdiff_t 相关的支持;需要 libc 包。

example – 启用使用 printf-wrap 的示例,包括 C 标准库函数的一些包装;同样需要 libc 包。

许可证

此包受 MIT 许可证或 Apache License 2.0 许可证中的任一许可证许可,具体选择由您决定。MIT 许可证Apache License 2.0 许可证

依赖关系