fflush() 在无效 FILE 指针上返回 0

问题描述 投票:0回答:1
当我阅读

fflush

的文档时,它说它返回0,如果成功,则返回EOF(EOF在我的机器上为-1),否则返回。 (参见 
https://man7.org/linux/man-pages/man3/fflush.3.htmlhttps://en.cppreference.com/w/c/io/fflush

所以我创建了以下示例:

#include<cstdio> #include<iostream> int main() { FILE* fp = std::fopen("/tmp/test", "w+"); std::fclose(fp); std::cout << std::fflush(fp) << std::endl; return 0; }
如果我用 

g++ minimal.cpp

g++ -O2 -DNDEBUG minimal.cpp
 编译它,它会打印 -1。
这正是我所期望的。

但是,当我用

g++ minimal.cpp -fsanitize=address

g++ minimal.cpp -fsanitize=thread
 编译它时,它只打印 0。

我也可以用 clang 重现同样的问题。

怎么会这样?

我在 Debian 12 amd64 机器上使用了 g++-12 和 clang-15。它始终是相同的结果(即

fflush

 返回 0 而不是 -1)。

c++ gcc clang fflush sanitizer
1个回答
5
投票
根据fflush的文档(C99标准中的7.19.5.2):

如果流指向输出流或更新流,其中最新的 未输入操作,fflush 函数会导致该流出现任何未写入的数据 传送到主机环境写入文件;否则,行为是 未定义。

这意味着如果您在未打开的文件上调用它(正如您所做的那样),您会得到未定义的行为。

这来自于 C 标准在历史上是一个“事实上的”标准,它将不同实现所做的所有共同的事情收集在一起,而不是试图“强迫”不同的实现者实现相同的事情。 因此,在很多地方(特别是错误或极端情况),历史上不同的实现做了不同的事情,所以标准只是说“未定义”。

© www.soinside.com 2019 - 2024. All rights reserved.