C++ TOCTTOU-在处理文件之前使用access
我有一个函数,它将文件复制到镜像目录,然后删除旧目录。它工作得很好,但是,在Coverity中,我的代码显示为TOCTTOU警告C++ TOCTTOU-在处理文件之前使用access,c++,file-handling,coverity,tocttou,C++,File Handling,Coverity,Tocttou,我有一个函数,它将文件复制到镜像目录,然后删除旧目录。它工作得很好,但是,在Coverity中,我的代码显示为TOCTTOU警告 void function(){ const char *original_key = "path/to/file/filename"; const char *mirror_key = "path/to/another/file/filename"; if((access(original_key, F_OK) == 0) &&am
void function(){
const char *original_key = "path/to/file/filename";
const char *mirror_key = "path/to/another/file/filename";
if((access(original_key, F_OK) == 0) && (access(mirror_key, F_OK) == 0)){
copy_file("/bin/cp %s %s", original_key, mirror_key); /*copy function in another cpp file*/
unlink(original_key);
}
}
/* in another cpp file */
int copy_file(const char*command, ...){
int rc = -1;
va_list args;
char *buffer = NULL;
va_start(args, command);
vasprintf(&buffer, command, args);
va_end(args);
if (buffer)
{
char *wrd;
char *ptr = buffer;
std::vector<const char *> list;
while ((wrd = strsep(&ptr, " ")) != NULL)
{
if (strlen(wrd))
{
list.push_back(wrd);
}
}
if (list.size() > 0)
{
char *argv[list.size() + 1];
for (size_t idx = 0; idx < list.size(); idx++)
{
argv[idx] = (char *)list[idx];
}
argv[list.size()] = NULL;
rc = system_spawn_args(argv);
}
free(buffer);
}
return(rc);
}
在这种情况下,有没有办法防止TOCTTOU
注意:移动不起作用-跨设备错误
谢谢问题可能是使用函数access时出现的典型Unix/Linux错误。文中给出了具体细节,甚至举例说明。对于如何降低风险也有一些建议 因为它在链接的Wikepedia文章中有很好的描述,所以我不会在这里重复
,因为在您的示例中没有C++代码,所以您可能希望重写C++中的代码。另外,使用系统调用的复制函数似乎过于复杂
请考虑重构它。因此,我还建议您阅读一篇关于在stackoverflow上复制文件的文章如果您的代码是非生产性的,并且仅供家庭使用,那么您也可以忽略此消息 因为我的主要功能基本上是将一个文件移动到另一个文件。我只是使用了rename,它完成了任务,也没有警告我,因为Coverity中有很多代码缺失。所以很难判断。我猜在现实中,原始密钥和镜像密钥有不同的内容。此外,access会检查文件而不是路径。还有,你是如何复制的?如何打开镜像文件?。我想,这些重要的信息不见了。顺便说一句,我从Coverity只遇到了很少的误报。与QAC、SonarCube或Lint相比,这确实是我的个人经验。这在很大程度上取决于应用程序。如果原始文件没有被删除,问题有多大?@Armin Montigny-根据您的问题添加了缺失的部分。我希望如此helps@user1937198-我需要实际删除it@JezT文件在传输过程中丢失是否有问题?如果是这样,您可以打开文件,删除它,然后将内容复制到新位置吗?