2025 年 1 月 19 日的文章my reddit comment展示了 C 程序中std::unordered_map
和std::vector
的等效技术。这些数据结构的核心重要特性每行代码只需十几行。它们编译快速,在调试构建中往往比 C++等效项的发布构建运行更快。它们在通用性方面的不足由简单性弥补。
- Allocator:使用简单的碰撞分配器,通过
new
宏分配内存,可消除 C 程序中的常见缺陷,如类型混淆错误、溢出计算、未初始化内存使用和内存泄漏等,但不满足一些特殊的分配器要求。 - Strings:使用计数字符串代替经典的空终止字符串,以避免错误。还定义了比较字符串相等的函数
equals
和字符串哈希函数hash64
,后者是 FNV 风格的哈希,将字符数据固定在 0 - 255 以避免char
的符号性影响结果。 - Flat hash map:使用Mask-Step-Index (MSI)哈希表实现字符串到字符串的映射,它在内存使用和速度方面更高效,但有独特键的硬限制,为
FlatEnv
结构,通过双哈希和开放地址搜索实现查找和插入。 - Hierarchical hash map:对于键数量无界的情况,使用哈希树,这里使用 4 元树,通过哈希和指针遍历实现查找和插入,零状态下即可使用。
- String concatenation:添加字符串连接函数
concat
,用于将字符串连接成envp
数据结构,以便在execve(2)
中使用,还定义了复制字符串的函数copy
,处理特殊的空指针情况。 - Dynamic arrays:添加动态数组工具,实现
std::vector
等效功能,通过push
宏和push_
函数进行插入和扩展数组,处理数组的创建、扩展和内存分配。 - Putting it all together:定义
env_to_envp_
和env_to_envp
函数,用于将Env
结构转换为envp
数组,递归实现但可能在处理大环境时导致栈溢出,还提供了使用栈数据结构的安全版本env_to_envp_safe
,以及讨论了使用链接列表作为替代方法。 - Hash hardening (bonus):为防止哈希映射的非确定性带来的安全漏洞,通过将哈希函数的种子设置为
FlatEnv
或Env
的地址,并利用地址空间布局随机化 (ASLR) 来增加随机性,使攻击者难以设计碰撞。
文章的可运行形式代码位于example.c
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。