提问人:Vince W. 提问时间:12/17/2021 更新时间:12/17/2021 访问量:86
如何探测损坏或更改 C++ std::filesystem::exists 函数的答案
how to probe corruption of, or changing answer from C++ std::filesystem::exists function
问:
首先:我不知道如何创建这个问题的MVCE。我意识到这对这个网站来说是一个很大的禁忌,但坦率地说,我这里有很多专业知识,我不知道有更好的地方来问这个问题。也许答案是,发布这个问题。<insert other site here>
问题:关于这里发生了什么,我该如何探究这个问题,有什么想法吗?
无论如何,代码库是 >10K 行 fortran,它也在开源C++库中链接。因此,它是 Fortran 和 C++ 的内部代码的组合,有很多事情要做。nanort
在代码的某个地方,我必须读取 C++ 中的二进制文件并解析它。我遇到的问题是,在10%的时间里,该函数告诉我文件不存在,即使它存在。事实上,fortran 例程告诉我它确实存在于程序的同一执行中。此外,在程序开始时,例程告诉我它确实存在。std::filesystem::exists
inquire
std::filesystem::exists
所以这是在一个简单的文本图表中布置的
program starts
fortran calls C++ -> std::filesystem::exists reports that the file exists
...
many other things happen
...
fortran calls C++ -> std::filesystem::exists reports that the file does not exists and returns to fortran with an error flag
the fortran inquire function reports that the file does in fact exist
请记住,这种情况只发生在 10% 的情况下。另外 90% 的时间程序运行良好(据我所知)。
系统信息:
Mac OSX Big Sur
g++11, with -std=c++17 and -O3
gfortran with -fbounds-check and -O3
答:
1赞
Vince W.
12/17/2021
#1
即使有点尴尬,也会回答这个问题。
将 fortran 字符数组传递给 C void 函数时,将其作为指向字符数组的指针传递。执行此操作时,您需要确保字符数组在所需的位置具有 null 终止。
虽然我创建了一个带有 null 终止的文件名的副本,但我错误地将非 null 终止的字符串传递给了 C++。鉴于程序的未定义位,大多数时候这实际上还是成功的,但有时它不是,我得到了一个非 null 终止的文件名字符串,系统告诉我该字符串不存在。
评论
std::error_code
std::filesystem::exists