I've been coding in C long enough to know the difference between unspecified/undefined behaviour and bona-fide bugs.
For example, I'm pretty darn sure that a chunk of code such as:
unsigned char inbyte;
read(fd,&inbyte,sizeof(inbyte));
should always read at most the same number of bytes (one byte would be nice, but let's pretend we're non-POSIX, here...). And if you *change* that chunk of code to something like, say:
unsigned char inbyte;
assert(sizeof(inbyte)==1);
read(fd,&inbyte,sizeof(inbyte));
It should *still* read at most the same number of bytes as the first chunk of code. If the second chunk of code reads 1 byte while the previous chunk of code was reading 2 bytes (and, incidentally, bashing the stack while dumping those 2 bytes into a 1 byte variable), I'm comfortable in calling that a compiler bug.
Mid-late 90's Visual C++, in case you weren't aware, was not a good vintage.