原作者:Sean Loaring,Slore
原地址:https://github.com/slorelee/binmay
近期,DeepSeek 编程能力增强了,我借此审核并优化源码,主要优化项如下(欢迎反馈):
### 一、编译与可移植性修复
1. 移除不存在的类型转换
原版 `f_malloc` 中有 `(struct input*)malloc(size)`,该结构体未定义,会导致编译错误。优化版改为泛型 `xmalloc` 直接返回 `void*`。
2. 修正头文件
原版包含不标准的 ``,Windows 下找不到该文件。优化版已删除此依赖,代码纯 C 标准库即可编译。
3. 自定义 `getopt` 的返回值
原版遇到非法选项时返回传入字符 `c`,可能干扰外部逻辑;优化版统一返回 `'?'`,符合 POSIX 惯例,并改进错误信息中显示程序名。
### 二、内存安全与资源管理
4. 消除内存泄漏
原版所有 `f_malloc` 分配的对象(文件句柄、缓冲区、掩码结构等)均未释放。优化版引入 `cleanup` 统一释放路径,添加 `file_handle_free`、`buffered_handle_free` 等函数,确保资源被回收。
5. 修复符号扩展 bug
原版 `masked_replace` 中直接对 `char` 做 `~` 操作,在 `char` 为有符号的平台上会先提升为 `int`,导致错误的符号位扩展。优化版先转换为 `unsigned char`,再参与位运算,确保掩码合并的正确性。
6. 备份文件名截断防护
原版使用 `strcat(fname, ".org")` 并直接 `rename`,若原始文件名长度接近 `BUF_LEN`,拼接后的备份文件名可能溢出。优化版改为 `snprintf` 并预先检查长度,超长时提前报错。
### 三、错误处理增强
7. 函数返回值规范化
原版大量函数调用 `exit(1)` 或 `abort()` 直接终止。优化版中 `file_handle_setfile`、`masked_string_setstr`、`process_string` 等关键函数返回错误码(-1 或非零),由上层统一处理并跳转至 `cleanup`,程序能以受控方式退出并释放资源。
8. 错误退出码一致性
原版很多失败路径虽打印了错误信息,但 `main` 依旧返回 0。优化版确保所有 `goto cleanup` 前设置了 `retcode = EXIT_FAILURE`,批处理脚本能准确通过 `%ERRORLEVEL%` 判断成败。
9. I/O 错误全面检查
原版多处 `fwrite`、`fread` 仅检查是否返回 1(逻辑错误),优化版使用“读写字节数是否等于期望”的方式,并检查 `ferror`,明确区分 EOF 和错误。
10. 空搜索串保护
优化版在 `masked_string_ensuremask` 中增加 `length == 0` 检查,防止因空搜索串导致死循环或逻辑混乱。
### 四、代码结构与可维护性
11. 全局变量局部化
原版 `verbose`、`UseBinaryP` 等为外部可见全局变量;优化版改为 `static` 文件作用域,消除符号冲突风险。
12. 函数声明全部静态化
原版存在大量未实现的全局函数声明;优化版仅保留 `getopt` 为外部可见,其余均用 `static`,并提供完整实现,清晰界定接口。
13. 移除未使用函数
删除了 `open_outfile`、`flush_outbuf`、`b_getchar` 等残留声明,代码更简洁。
14. 增加 `own_file` 标志
文件句柄增加 `own_file` 字段区分我们打开的文件与 `stdin`/`stdout`,防止 `fclose` 误关标准流。
15. `main` 函数结构化
使用 `goto cleanup` 模式统一资源释放,避免重复代码,降低维护出错可能。
### 五、功能增强与细节改进
16. 缓冲区大小提升
`BUF_LEN` 从 1024 提升至 8 KB,`BLOCK_LEN` 从 1024 提升至 128 KB,大幅减少大文件处理的 I/O 调用次数,提升性能。
17. 帮助文本增强
明确标注大小写不敏感搜索限于 ASCII 字符(`(ASCII only)`),避免误解。
18. 文本格式说明更清晰
在帮助中补充了 `UTF-16LE` 等关键词,方便用户理解 `u:`/`U:` 格式的实际意义。
19. 修复原版未初始化行为
优化版通过 `xmalloc` 分配对象后设置默认值(如 `masklength = -1`),确保逻辑完整性,避免依赖未初始化内存。
---
### 总结
最终优化版修复了所有已知的编译错误、内存泄漏、符号位 bug 和错误处理缺陷,代码安全、健壮且易维护。在保持原版全部功能的同时,提升了性能和大文件处理的可靠性。

