fflush
的文档时,它说它返回0,如果成功,则返回EOF(EOF在我的机器上为-1),否则返回。 (参见https://man7.org/linux/man-pages/man3/fflush.3.html 或 https://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)。
如果流指向输出流或更新流,其中最新的 未输入操作,fflush 函数会导致该流出现任何未写入的数据 传送到主机环境写入文件;否则,行为是 未定义。这意味着如果您在未打开的文件上调用它(正如您所做的那样),您会得到未定义的行为。
这来自于 C 标准在历史上是一个“事实上的”标准,它将不同实现所做的所有共同的事情收集在一起,而不是试图“强迫”不同的实现者实现相同的事情。 因此,在很多地方(特别是错误或极端情况),历史上不同的实现做了不同的事情,所以标准只是说“未定义”。