realpath()的安全替代方法是什么?

dro*_*del 16 c c++

我正在开发一个程序,它使用realpath()来获取文件的绝对路径.不幸的是,这个函数需要一个字符串缓冲区,它预计会非常大,以至于当这个应用程序必须在多个平台上运行时,这个缓冲区就不安全了.是否有这个功能的安全版本,可以避免缓冲区溢出问题,可能使用动态内存分配?

R..*_*R.. 20

有关安全和便携使用的信息,请参见此处realpath:

http://www.opengroup.org/onlinepubs/9699919799/functions/realpath.html

基本上,现代标准允许您传递NULL指针,realpath并将分配适当长度的缓冲区.如果您想要移植到不支持此标准的旧系统,只需检查#ifdef PATH_MAX并使用长度固定大小的缓冲区PATH_MAX.据我所知,没有遗留系统缺少常量PATH_MAX但不支持NULL参数realpath.

  • 在检查PATH_MAX之前,请记住包含<limits.h>,否则将无法定义. (8认同)

Eva*_*ran 14

从联机帮助页:

如果resolve_path指定为NULL,则realpath()使用malloc(3)分配最多为PATH_MAX字节的缓冲区来保存已解析的路径名,并返回指向此缓冲区的指针.调用者应使用free(3)使用free(3).buffer释放此缓冲区.

所以看起来你可以这样做:

char *real_path = realpath(path, NULL);
// use real_path
free(real_path);
Run Code Online (Sandbox Code Playgroud)

  • 这是POSIX 2008的标准行为,但我相信它在过去是一个GNU扩展.请参阅我的答案,以获得更轻松的方法. (2认同)