Ironically, five minutes after writing this post I encountered such a bug in real life, so I thought I should share it here:
I aided in debugging a problematic Windows program where none could understand why the program sometimes wrote strange rubbish output to files.
The program was using fprintf() and the bug was that at one line, a C++ string object was passed to fprintf (by value!) rather than a C string. Ie:
string str;
fprintf(file, "%s", str);
rather than
fprintf(file, "%s", str.c_str());
As you might know, C++ has even stronger type checking than C. Yet the modern Windows C++ compiler failed to see the above bug. No typechecking, no warnings... just because of the va_list used by fprintf. Had for example C++ file handling been used instead, the bug would have been killed at the first compile early on in development, rather than far later, in production code.