Quando li a documentação do fflush
, ela diz que retorna 0, se foi bem-sucedido e retorna EOF (EOF está na minha máquina -1) caso contrário. (veja https://man7.org/linux/man-pages/man3/fflush.3.html ou https://en.cppreference.com/w/c/io/fflush )
Então criei o seguinte exemplo:
#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;
}
Se eu compilar com g++ minimal.cpp
ou g++ -O2 -DNDEBUG minimal.cpp
, ele imprime -1. Que é o que eu esperava.
Entretanto, quando eu compilo com g++ minimal.cpp -fsanitize=address
ou g++ minimal.cpp -fsanitize=thread
, ele imprime apenas 0.
Também posso reproduzir o mesmo problema com o clang.
Como isso pode ser?
Usei g++-12 e clang-15 na minha máquina Debian 12 amd64. É sempre o mesmo resultado (ou seja, fflush
retorna 0 em vez de -1).
De acordo com a documentação (7.19.5.2 no padrão C99) para fflush:
Isso significa que se você chamá-lo em um arquivo que não está aberto (como você está fazendo), você obterá um comportamento indefinido.
Isso vem do padrão C historicamente ser um padrão "de fato", reunindo todas as coisas comuns que diferentes implementações faziam, em vez de tentar "forçar" diferentes implementadores a implementar a mesma coisa. Então, há muitos lugares (particularmente com erros ou casos extremos) onde diferentes implementações historicamente fizeram coisas diferentes, então o padrão apenas diz "indefinido".