我正在开发一个程序,它使用realpath()来获取文件的绝对路径。不幸的是,这个函数需要一个字符串缓冲区,它预计会非常大,以至于当这个应用程序必须在多个平台上运行时,这个缓冲区就不安全了。是否有这个函数的安全版本可以避免缓冲区溢出问题,可能使用动态内存分配?
答案 0 :(得分:18)
有关安全和便携使用realpath
的信息,请参阅此处:
http://www.opengroup.org/onlinepubs/9699919799/functions/realpath.html
基本上,现代标准允许您传递NULL指针,realpath
将分配适当长度的缓冲区。如果您希望可移植到不支持此标准的旧系统,只需检查#ifdef PATH_MAX
并使用长度为PATH_MAX
的固定大小缓冲区。据我所知,没有遗留系统缺少常量PATH_MAX
但不支持realpath
的NULL参数。
答案 1 :(得分:13)
从联系手册:
如果将resolved_path指定为 NULL,然后realpath()使用malloc(3) 分配最多为PATH_MAX的缓冲区 用于保存已解析路径名的字节, 并返回指向此缓冲区的指针。 调用者应该解除分配 缓冲区使用free(3).buffer使用free(3)。
所以看起来你可以这样做:
char *real_path = realpath(path, NULL);
// use real_path
free(real_path);
答案 2 :(得分:2)
有一种方法可以使用boost::filesystem在Boost中执行相同操作:
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
try{
path absolutePath = canonical("./../xxx"); //will throw exception if file not exists!
}
catch{...}{
cout << "File not exists";
}
cout << absolutePath.string();
有QT方法(来自here):
QFileInfo target_file_name(argv[1]);
QString absolute_path = target_file_name.absolutePath()
有点复杂implementation of realpath in C++。无法说出它的安全性,但它应该允许长度超过PATH_MAX
的路径。要尽快测试一下。