#yaml #safer #safe #idiomatic #unsafe-libyaml #port #require

bin+lib libyaml-safer

更安全的libyaml移植,基于unsafe-libyaml

2个版本

0.1.1 2024年2月11日
0.1.0 2024年2月9日

#1029 in 解析器实现

Download history 6/week @ 2024-03-13 18/week @ 2024-03-27 183/week @ 2024-04-03 362/week @ 2024-04-10 459/week @ 2024-04-17 185/week @ 2024-04-24 11/week @ 2024-05-01 13/week @ 2024-05-15 58/week @ 2024-05-22 27/week @ 2024-05-29 64/week @ 2024-06-05 28/week @ 2024-06-12 39/week @ 2024-06-19 59/week @ 2024-06-26

193 每月下载量
4 个crate(直接使用2个) 中使用

自定义许可证

250KB
6.5K SLoC

libyaml-safer

github crates.io docs.rs build status

此库是unsafe-libyaml的分支,已翻译成安全和惯用的Rust。

unsafe-libyaml是将C语言编写的libyaml翻译成不安全的Rust,并借助c2rust进行转换。

[dependencies]
libyaml-safer = "0.1"

编译器支持:需要rustc 1.70

注意

此库使用与unsafe-libyaml相同的测试套件,这也是libyaml的“官方”测试套件。该库逐行、逐函数从unsafe-libyaml移植,目的是精确匹配其行为,包括性能和分配模式。除因Rust惯例导致的API差异之外,任何可观察到的行为差异都视为错误。

上述内容的一个显著例外是,在此库中,尽可能使用Rust标准库替换自定义例程。例如,大多数UTF-8和UTF-16编码和解码由标准库处理,而输入/输出回调被替换为相应的std::io::* traits。由于使用了std::io,此库目前无法使用no_std

内存分配模式通常保持不变,但标准库容器可能会使用不同的启发式方法过度分配缓冲区。

在libyaml例程被标准库替换的地方,某些错误可能比libyaml(例如,错误消息可能略有不同)报告的精确度低,但相同的输入应生成相同的一般错误。

兼容性和互操作性

尽管此库与libyaml的行为一致,但它并不是作为直接替换而设计的。API的形状是惯用的Rust,尽管可以使用此库模拟C API,但支持此用例不是优先事项。如果需要,请使用unsafe-libyaml

性能

性能与 unsafe-libyaml 大体相当。除了选择最直接的方法将 C 类代码的概念合理地移植过来之外,没有在这方面投入显著的努力。

请参阅 benches/bench.rs 以获取一个非常简单的基准测试,它处理一个非常大的 (~700 KiB) YAML 文档。在我的机器(Ryzen 9 3950X)上,这个库的解析器稍微慢一点,而发射器稍微快一点,但两者都与不安全的对应物大约 ~1ms 的差距。在您的机器上运行 cargo bench 以进行测试。

如果有需求,优化解析器的路径是明确的。例如,由于它是直接从执行指针算术的不安全 C 类代码移植过来的,因此它为每个输入字节执行了完全不合理数量的边界检查。

许可证

MIT 许可证,与 unsafe-libyaml 和 libyaml 相同。

无运行时依赖