You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:57:04