用途
loom-c 面向已经掌握 C 语言的开发者,提供编写生产质量系统代码的决策规则和陷阱清单。核心关注点包括:谁拥有每个分配、失败如何报告、哪些操作属于未定义行为(UB)、缓冲区如何限定边界,以及构建系统、消毒器和测试如何捕获编译器无法发现的问题。
主要能力
资料围绕以下主题展开:
- 工具链:提供 CMake 配置、构建、测试、静态分析、格式化和内存检查的命令。建议使用 CMake 3.20+ 和预设,开启编译警告(-Wall -Wextra -Wpedantic -Wshadow -Wconversion -Wformat=2),仅在 CI 中使用 -Werror。标准固定为 -std=c17 或 c11,除非需要否则关闭 GNU 扩展。C23 特性(nullptr、bool/true/false 关键字、constexpr、typeof、#embed、[[nodiscard]]、<stdckdint.h>)需要确认 GCC 13+ 和 Clang 18+ 支持。
- 内存所有权:每个堆块有唯一所有者,负责释放一次。建议使用 _new/_free 配对、_take 表示消耗参数、_borrow 或 const T * 表示视图。提供 series_new/series_free 示例,强调检查每个分配、使用 sizeof *p、避免强制转换 malloc 返回值、使用 calloc 检查乘法溢出、realloc 失败时不丢失原指针、free 后置 NULL、使用 goto 标签链进行清理。
- 错误处理:C 没有异常,函数通过返回值报告失败。资料给出常见约定(返回 0 成功/负值失败、返回指针 NULL 失败、返回 bool 并通过 T out 输出结果、每个模块一个枚举错误码),并提供 parse_int 示例。强调 errno 仅在特定调用后有意义、检查 fopen/fclose/fwrite/fread/malloc/snprintf/close/write/pthread_ 等可能失败的调用、标记 [[nodiscard]]、处理 EINTR、避免 atoi/atof/gets/system。
- 未定义行为:以表格形式列出常见 UB 操作及修复方法,包括有符号整数溢出、越界读写、释放后使用/双重释放、NULL 解引用、未初始化读取、移位越界、除零、指针算术越界、严格别名、未对齐访问、写入字符串字面量、未排序的多次修改、memcpy 重叠、对 NULL 指针调用 memcpy/memset/strlen、将负值 char 传给 isalpha/toupper、printf 格式错误、数据竞争、非 void 函数未返回值等。提供 add_overflows 正误对比示例。
- 字符串与缓冲区:建议避免 gets、scanf("%s")、strcpy、strcat、sprintf、strncpy、strtok、atoi,改用 fgets/getline、snprintf、memcpy 加终止符、strtok_r、strtol。提供 copy_str 和 format_id 示例,强调 snprintf 返回值检测截断、sizeof 仅对同作用域数组有效、传递(指针、长度)对或视图结构、禁止将用户输入作为格式字符串、读取整个文件使用 fread 加 fstat、char 是字节且 UTF-8 需库处理。
- 头文件与模块:提供 include/spool.h 示例,使用包含守卫或 #pragma once、头文件只声明不定义、每个头文件自包含、不透明类型隐藏布局、static 提供内部链接、共享全局通过 extern 声明、导出名称加模块前缀、宏参数加括号并避免多次求值、优先 static inline 函数和枚举常量、传递 void *ctx 参数避免全局变量。
- 消毒器和分析:列出 AddressSanitizer、UndefinedBehaviorSanitizer、ThreadSanitizer、Valgrind、clang-tidy、cppcheck 的用法和发现的问题类型。建议在 CI 中每次变更都运行 ASan 和 UBSan 测试套件,使用 ASAN_OPTIONS=detect_leaks=1:abort_on_error=1。还提到加固选项(-D_FORTIFY_SOURCE=3 -fstack-protector-strong -fPIE -pie -Wl,-z,relro,-z,now)。
- 测试:对比 CTest、Unity、cmocka 框架的适用场景。提供 cmocka 测试示例,说明 CTest 名称选择整个可执行文件,cmocka 一个可执行文件运行一组用例,ctest -R 无法选择单个用例,若 loom 契约针对单个用例则为该用例创建独立可执行文件和 add_test 条目。测试覆盖边界值:空输入、缓冲区为 cap - 1、cap、cap + 1 字节、INT_MAX、SIZE_MAX 等。
使用方式
资料以决策规则和代码示例形式呈现,没有提供技能安装或调用的具体步骤。暂未提供使用方式说明。
适用场景
适合需要编写内存安全、可移植、生产质量 C 代码的系统程序员,尤其是在 Linux/POSIX 环境下使用 CMake、消毒器和静态分析工具的项目。也适合作为代码审查时的检查清单,避免常见 C 语言陷阱。
限制
资料未提供技能的安装方式、调用接口、性能数据或与其他工具的集成说明。部分内容(如 C23 特性)需要特定编译器版本支持。测试部分仅覆盖到边界值列表中的部分内容,其余可能暂未提供。