20个版本 (12个破坏性更新)
0.13.0 | 2024年2月17日 |
---|---|
0.11.0 | 2023年11月23日 |
0.8.0 | 2023年7月20日 |
0.5.0 | 2023年3月16日 |
0.3.3 | 2022年11月27日 |
#97 in 无标准库
每月下载量126
570KB
7.5K SLoC
NSTD
一个跨平台、快速、安全的通用C库,用Rust编写。
该库组织为一组模块。顶级模块 nstd
包含整个包。每个模块可以有它们自己的子模块(例如 nstd.io.stdout
或 nstd::io::stdout
,使用Rust语法)。
使用C的示例
// Build nstd with features set to "capi core io".
#include <assert.h>
#include <nstd.h>
/// Main entry point of the program.
int main(void) {
const NSTDOptionalStr output_opt = nstd_core_str_from_raw_cstr("Hello, 🌎!");
assert(output_opt.status);
const NSTDStr output = output_opt.value.some;
const NSTDIOError err = nstd_io_print_line(&output);
assert(err == NSTD_IO_ERROR_NONE);
return 0;
}
库模块
nstd
- 一个用Rust编写的跨平台、快速、安全的通用C库。alloc
- 低级内存分配。core
- 为nstd
提供核心功能。alloc
- 提供用于内存分配支持的有用类型。cstr
- 不拥有的C字符串切片。raw
- 原始C字符串处理。
cty
- 提供用于检查和操作字符类型的功能。def
- 包含在nstd
中使用的一些常见类型。fty
- 提供用于检查和操作浮点类型的功能。ity
- 提供用于检查和操作整型类型的功能。math
- 低级数学运算。mem
- 包含与原始内存交互的大多数不安全函数。ops
- 为可能引起溢出的类型和运算符提供重载。optional
- 表示一个可选(可能未初始化)的值。ptr
- 指向任意类型的带大小指针。range
- 数值范围。result
- 定义一个具有成功和错误变体的 "结果" 类型。slice
- 对内存中一系列值的视图。str
- 对UTF-8编码的字节字符串的未拥有视图。time
- 低级时间实用程序。unichar
- Unicode标量值。
cstring
- 动态大小的、以null结尾的C字符串。env
- 进程环境管理。fs
- 提供对文件系统的访问。file
- 打开文件的句柄。
heap_ptr
- 单值堆分配的指针类型。io
- 提供与标准I/O流交互的功能。stderr
- 标准错误流的句柄。stdin
- 标准输入流的句柄。stdout
- 标准输出流的句柄。
math
- 高级数学运算。mutex
- 一个用于保护共享数据的互斥原语。os
- 操作系统特定功能。unix
- 低级类Unix操作系统支持。alloc
- 类Unix系统的内存分配。io
- 提供在Unix平台上处理输入和输出的功能。mutex
- 一个用于保护共享数据的互斥原语。shared_lib
- 为类Unix系统提供共享库访问。time
- Unix时间工具。
windows
- Windows操作系统支持。alloc
- Windows的低级内存分配。heap
- Windows进程堆管理。
shared_lib
- Windows的共享库/模块访问。str
- Windows的字符串切片扩展。
proc
- 调用/子进程管理。shared_lib
- 访问已加载的共享库中的符号。shared_ptr
- 一个引用计数智能指针。string
- 动态大小的UTF-8编码的字节字符串。thread
- 线程创建、连接和分离。time
- 时间工具。timed_mutex
- 带定时锁定机制的互斥原语。vec
- 动态大小的值连续序列。
平台支持
nstd.core
应该支持Rust编译器支持的所有功能。此模块对裸机环境有第一类支持。
nstd.os
的子模块只能在它们针对的操作系统上工作。例如,nstd.os.windows
只能在Windows上工作,而 nstd.os.unix
只能在类Unix系统上工作。
其他模块将在大多数平台上工作,主要针对Windows、macOS、Linux、Android和iOS。
语言支持
此库可以从支持调用C代码的任何语言访问。目前,这需要手动完成,因为没有官方的包装器,但是当API变得更加稳定时,计划开始添加官方包装器,以便其他语言的开发者可以轻松使用API。
安全性
请注意,这些安全说明(以及整个框架)都是工作在进度中。
用户安全说明
-
原始指针访问是不安全的。
-
假设引用是有效的(对齐的、非空的和非悬挂的),并且是安全的访问。用户可以参考文档以查看哪些API期望或返回有效的引用。
-
假设C函数指针非空,除非它们被包装在
Option
中。 -
私有(非
pub
)结构体成员不允许用户直接访问。 -
在访问之前必须检查标记枚举变体(例如
NSTDOptional
或NSTDResult
类型)。 -
当使用未实现
Copy
的类型时的值拷贝语义时,数据会被移动。 -
当数据被另一个对象引用时,数据不允许被移动或修改。
-
未实现
Send特征的类型不允许在线程之间发送。
-
未实现
Sync特征的类型不允许在线程之间共享。
贡献者安全注意事项
-
任何可能导致未定义行为的操作必须标记为不安全。
-
API接受的全部C函数指针都必须标记为不安全。
-
默认情况下,panic行为设置为终止,因为从Rust代码反解构到外部代码是未定义行为(尽管这可能会改变)。
如何构建
将nstd
构建为C库需要您手动指定"crate-type"。为此,您必须将--crate-type
传递给rustc,可以是cdylib
或staticlib
。如果需要两者,Rust允许您多次使用此标志。
nstd
让您选择想要使用哪些功能。
顶层模块下的任何模块都有一个专用的功能标志,例如nstd.core
有功能标志core
,而nstd.alloc
有功能标志alloc
。
每个模块可能有额外的功能,例如nstd.os
有用于Windows内存分配的附加os_windows_alloc
功能,这允许其他模块使用Windows的低级内存分配API,而不必为其他操作系统启用内存分配。
std
功能标志将Rust标准库链接到二进制文件中。
capi
功能标志用于将nstd
构建为C库。
link
功能标志将链接到系统上现有的nstd
库。此功能被鼓励,但不是必需的,对于使用nstd
的capi
功能的Rust包。
std
和core
默认启用。
示例
cargo rustc --release --crate-type cdylib --crate-type staticlib --features "capi alloc string"
构建时启用所有模块
cargo rustc --release --crate-type cdylib --crate-type staticlib --features "nstd"
使用cargo-c
安装
nstd
还允许您使用cargo-c
构建或安装库。
安装cargo-c
cargo install cargo-c
以下是一个示例,说明如何构建启用所有功能的Unix机器上的库
cargo cinstall --release --all-features --destdir=./install --prefix=/usr --libdir=/usr/lib
这将创建一个新目录install
,其中包含安装内容。
现在您可以使用cp
将内容复制到根目录
sudo cp -a ./install/* /
更多信息可以在cargo-c仓库以及Luca Barbato的这篇博客文章中找到。
发布
nstd
版本遵循语义版本规则。每个版本都有一个主版本号、次版本号和补丁号,这些构成了库的版本(major.minor.patch)。
框架尚未稳定,因此尚未有任何重大版本发布。
每6周发布一个新的小版本,正好在新的小版本Rust发布后一周。
修补版本会不定期发布,包含一些小修复和新增功能。
有关语义版本化的更多信息,请参阅semver.org。
依赖项
~0–8.5MB
~66K SLoC