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

getcwd()是否忽略缓冲区大小?实测异常场景疑问

问题分析与解答

测试代码

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main() {
    
    char wd[10];

    if(getcwd(wd,BUFSIZ) == NULL){   //BUFSIZ = 8192
            perror("getcwd");
            exit(1);
    }
    printf("wd = %s\n",wd);
}

问题解答

你的理解存在偏差,实际问题出在传入了错误的缓冲区大小参数,而非getcwd无视缓冲区限制:

  • getcwd的第二个参数需要传入缓冲区的实际可用字节数,你传入了BUFSIZ(8192),但实际缓冲区wd仅10字节。函数会基于你提供的大小,尝试将完整的当前工作目录写入缓冲区,直接引发缓冲区溢出——超出wd数组范围的内容会覆盖栈上的其他内存区域。
  • 程序能正常输出只是巧合:溢出的内存暂时未被关键数据覆盖,也没触发内存访问错误,但这属于C语言中的未定义行为,后续任何操作都可能导致程序崩溃、数据损坏,甚至被利用产生安全风险。
  • 正确用法是传入缓冲区的真实大小(比如sizeof(wd)),若当前目录长度超过缓冲区大小,getcwd会返回NULL并设置错误码,此时可改用动态分配内存的方式(比如调用getcwd(NULL, 0),让函数自动分配足够内存)。

内容的提问来源于stack exchange,提问作者Jaemin Ryu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:30:51