Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TOCTTOU-在处理文件之前使用access_C++_File Handling_Coverity_Tocttou - Fatal编程技术网

C++ TOCTTOU-在处理文件之前使用access

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

我有一个函数,它将文件复制到镜像目录,然后删除旧目录。它工作得很好,但是,在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) && (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文件在传输过程中丢失是否有问题?如果是这样,您可以打开文件,删除它,然后将内容复制到新位置吗?