如何探测损坏或更改 C++ std::filesystem::exists 函数的答案

how to probe corruption of, or changing answer from C++ std::filesystem::exists function

提问人:Vince W. 提问时间:12/17/2021 更新时间:12/17/2021 访问量:86

问:

首先:我不知道如何创建这个问题的MVCE。我意识到这对这个网站来说是一个很大的禁忌,但坦率地说,我这里有很多专业知识,我不知道有更好的地方来问这个问题。也许答案是,发布这个问题。<insert other site here>

问题:关于这里发生了什么,我该如何探究这个问题,有什么想法吗?

无论如何,代码库是 >10K 行 fortran,它也在开源C++库中链接。因此,它是 Fortran 和 C++ 的内部代码的组合,有很多事情要做。nanort

在代码的某个地方,我必须读取 C++ 中的二进制文件并解析它。我遇到的问题是,在10%的时间里,该函数告诉我文件不存在,即使它存在。事实上,fortran 例程告诉我它确实存在于程序的同一执行中。此外,在程序开始时,例程告诉我它确实存在。std::filesystem::existsinquirestd::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
C++ GCC Fortran C++-标准库

评论

0赞 NathanOliver 12/17/2021
您可以做的一件事是使用重载,希望能够捕获是否存在某种 IO 故障。std::error_codestd::filesystem::exists
0赞 BoP 12/17/2021
一些有用的细节:文件是一直存在,还是在程序运行期间重新创建?某些操作系统在再次可见之前会延迟。您使用完整路径还是相对路径?一些 IDE 可能会在他们愿意的时候随机更改“当前目录”。
0赞 Öö Tiib 12/17/2021
闻起来像是一些未定义的行为,这些行为是由缓冲区溢出、使用悬空引用、竞争条件或类似情况引起的。十几公斤的SLOC很小......苹果也试图提供帮助......developer.apple.com/documentation/xcode/......
0赞 Vince W. 12/17/2021
@BoP 它总是在那里

答:

1赞 Vince W. 12/17/2021 #1

即使有点尴尬,也会回答这个问题。

将 fortran 字符数组传递给 C void 函数时,将其作为指向字符数组的指针传递。执行此操作时,您需要确保字符数组在所需的位置具有 null 终止。

虽然我创建了一个带有 null 终止的文件名的副本,但我错误地将非 null 终止的字符串传递给了 C++。鉴于程序的未定义位,大多数时候这实际上还是成功的,但有时它不是,我得到了一个非 null 终止的文件名字符串,系统告诉我该字符串不存在。