SuperAPI AI 工具集

aiclean

编程与开发

查看项目

更新于 11-01 16:10

技能介绍

aiclean 是一个面向 radare2 代码库的清理与重构技能,目标是在不改变行为的前提下减少代码行数、降低不必要的复杂度、提高可读性,并优先使用 radare2 原生的可移植 API。

使用前提:先阅读项目的 AGENTS.md,了解项目规范。

工作流程:

  1. 审查整体改动。检查分支相对于 merge-base 的 diff 以及未提交的工作,并纳入调用者给定的函数或 URL 上下文。已提交到分支上的代码同样视为未审查;调用者给定的范围只在该 diff 内进一步收窄,不会超出 diff。

  2. 分析涉及的文件,列出项目中的常见编码实践。

  3. 在修改前,先查看同一子系统近期以清理为导向的历史。用 clean、cleanup、refactor、simplify、dedup、portable、dead code、reuse 等关键词搜索提交。

  4. 在打磨任何新的遍历、解析逻辑前,先查找是否已有现成 API。在 libr/include/ 中搜索 _foreach、_recurse、_dfs、iter,并查看 cmd*.inc.c 的帮助表;用现有 API 删除新写的代码,本身即是最好的一种清理。也要在待改文件中搜索同样的表达方式,匹配本地习惯通常比新增辅助函数更划算。

  5. 制定小规模计划,倾向于保持行为的简化、减少行数、更安全的归属与边界处理。逐一检查每个新增或改动的构造(结构体、循环、字符串判断、算术表达式、空指针检查、重复代码块),而不是只看显眼处。修复要针对概念,应用到该概念的所有调用点。

  6. 在可行时用针对性的测试或构建验证改动区域。保留一个改动必须无效的用例并确认其在基线分支上通过;逐一证明 diff 中每处行为都有测试覆盖:破坏它、指出失败的测试、再恢复代码。新测试应基于合成样本(malloc:// 加 wx)而非真实二进制加完整分析,并断言语义字段而非绝对字符偏移。

代码质量规则要点:缓存指针以减少双重解引用;尽量在同一行声明并赋值;使用正确类型(值仅为 0/1 时用 bool);直接返回比较结果而非 cond?1:0;为局部变量和测试函数取描述性名称;复用调用方已持有的值而非重复计算;同一文件的多个命令合并为一个 r2r 用例;用 R_STR_ISEMPTY/R_STR_ISNOTEMPTY 判断空串;结构体字段按宽度从大到小排列;长度无界的字符串优先用堆分配的 char * 而非固定缓冲区;混合运算加括号明确优先级;优先小而精准的补丁而非大改;行为优先,清理改变行为须有测试或明确缺陷证据。

去重与简化:统一重复的遍历、解析或格式化逻辑,抽取辅助函数/表/回调;两个循环仅前置过滤不同时抽取共同尾部;将仅常量不同的可变参数包装合并为函数加宏;仅数据不同的 if 块折叠为静态表加循环;保持扁平成员测试为 switch 穿透;跳过纯风格建议,只提出有实际行数或可读性收益的改动;对保留不动的代码加以说明。

控制流:if/else 中条件应为真/有效情形;用提前返回和 continue 展平嵌套;不用 goto 实现重试流程,应拆分长函数;仅在复杂函数中集中释放资源时可接受清理标签。

其余规则涉及:静态函数不使用 R_RETURN_;新静态辅助函数按调用处可读性命名并去掉 r_ 前缀(除非文件已有此习惯);公开 R_API 入口用 R_RETURN_ 做程序员错误的前置检查;在契约或外围守卫已保证非空时移除多余空检查,但不移除保护真实分配、IO、归属或边界失败检查;在循环前一次性校验大小、偏移、计数;用命名常量替代魔数;优先 r_strbuf_、r_str_newf、r_read_le/r_read_be*、r_num_get/r_num_math(区分非数字与合法 0 时用 r_num_get_err 等)、r_mem_dup、RList、RTable、Sdb 等既有原语;用 r_str_rchr 等替换 strchr 链;输出在循环中构建时用 *_tostring 加一次缓冲打印;避免多行注释;在简化其实错误的明显处加一行注释记录原因;避免不可移植的 libc 函数,代码须支持 Windows;移除隐藏全局状态,用显式上下文;保持单一所有权路径。

反复出现的清理模式:用手写遍历替换为既有 _foreach/_recurse API(如 r_anal_block_recurse_depth_first、r_graph_dfs_node、r_graph_dom_tree);把既检测条件又构建结构的回调拆为两趟;抽取带小型谓词/回调的共享辅助函数去重最近匹配或遍历逻辑;用 RStrBuf 替代手工字符串拼接;连续 strrchr 改为 r_str_rchr 续搜;仅文件内使用的函数应为 static;将打印繁重的辅助函数改为 *_tostring 风格;循环前预计算已校验的不变量;用有界 for(;;) 加重试标志替换重试 goto。

适用场景:radare2 及其相关代码库的代码清理、重构审查与精简。限制:该技能专为 radare2 项目规范设计,其余项目需适配;具体效果与测试工具未提供更多信息。