Hello folks, a couple of days ago when trying to use git-crypt I have noticed that it was not able to `std::cin.read()' (i.e. read 0 bytes) because a bit earlier `std::ios_base::sync_with_stdio(false)' was called (I have tested on a NetBSD/amd64 -current some weeks old):
Here a minimal reproducer: ``` #include <iostream> int main(int argc, char *argv[]) { char buffer[64]; #ifndef SYNC_WITH_STDIO std::ios_base::sync_with_stdio(false); #endif std::cin.read(buffer, sizeof(buffer)); std::cerr << "Length: " << std::cin.gcount() << std::endl; return 0; } ``` When `std::ios_base::sync_with_stdio(false)' is called the program suddendly exit without reading anything: ``` % ./a.out Length: 0 ``` If it is not called (i.e. the reproducer is built via `-DSYNC_WITH_STDIO') the program does what I would expect (and what `git-crypt' authors probably expected): ``` % ./a.out foo bar baz Length: 12 ``` I'm completely unfamiliar with C++ but it seems that calling `std::ios_base::sync_with_stdio(false)' leads to problems if C and C++ I/O are mixed and I think that calling it after I/O has occurred it is an undefined behaviour (but also in git-crypt it is called very early before any I/O happened). Anyone know why that happens? Thanks!