C语言调用read()读BUFFER_SIZE字节时出现多余未知数据如何排查
问题根因
- 未校验
open函数返回值:如果目标文件不存在、无读取权限或其他原因打开失败时,open会返回-1,后续传入无效fd调用read会直接触发调用失败 - 未处理
read的异常返回:read调用出错时会返回-1,你当前代码未对该场景做判断,直接执行buff[r] = '\0'等价于越界访问buff[-1],属于典型的未定义行为。此时buff有效区间内仍是malloc返回的未初始化脏数据,输出时就会出现不明来源的额外内容 - 循环逻辑存在漏洞:当
read返回-1时,非0的返回值会让while(r)判断为真,导致循环持续执行,反复输出脏数据
修复方案
- 新增
open返回值校验,打开失败直接终止流程 - 新增
read返回值判断,仅当返回值>0时才处理读取到的内容,返回值<=0时直接终止循环 - 补充内存分配失败校验、使用后资源释放逻辑,避免内存泄漏和空指针访问
修复后代码如下:
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> // 测试用定义,实际编译时可通过-DBUFFER_SIZE=10参数传入覆盖 #ifndef BUFFER_SIZE #define BUFFER_SIZE 10 #endif int main() { int fd; char *buff; int r; buff = (char *) malloc((BUFFER_SIZE + 1) * sizeof(char)); // 校验内存分配结果 if (!buff) { return 1; } fd = open("test", O_RDONLY); // 校验文件打开结果 if (fd < 0) { free(buff); return 1; } r = 1; // 仅r>0时继续循环,排除异常返回值的干扰 while (r > 0) { printf("BEFORE : %d\n",r); r = read(fd, buff, BUFFER_SIZE); printf("AFTER : %d\n",r); // 仅读取到有效内容时做字符串终止和输出 if (r > 0) { buff[r] = '\0'; printf("%s\n",buff); } } // 释放资源 free(buff); close(fd); return 0; }
内容的提问来源于stack exchange,提问作者Yasser Sakine
相关产品推荐
相关产品推荐

