Now if you keep insisting and come up with bright arguments such as "but xxx compiler has always treated this one UB in this particular way", this goes in the same basket as the "It compiles, so it worksTM" category. 
Do note that my arguments are not that.
I only point out that if basically all C compilers have treated something implementation-defined or undefined behaviour the same way, so that there is a lot of existing C code out there relying on that behaviour,
then it is safe to pile on and rely on it, regardless of how someone interprets the standard, because real world always beats theory and the text of the standard. Sure, a new version of a compiler may decide to do something stupid and break a lot of existing code, but its users won't be happy about the breakage, and will shift to something else. You can find some of these in POSIX and BSD, especially POSIX threads.
That does not mean that one can just try a small program and see if it works like one thinks it should, and if it does, go ahead and rely on it; NOT AT ALL.
What it means, actually, is that the C standard is a human contract between compiler developers and compiler users, and as such, is not perfect. Some argue that whenever there is a conflict between the C standard and existing code, the C standard should always be considered the authority. I disagree, because the standard text is not always unambiguous, and even when it is, it is written by humans and thus not necessarily correct. In such cases, I argue that the huge mass of existing code and the expectations they embody, is the authority, because only that way is a compiler
useful.
It is for this reason I do recommend reading the C standard, but also the sources of widely used C projects, and perhaps the POSIX.1 standard (
IEEE Std. 1003.1, freely available on the net), specifically the
system interfaces section. Conflicts do exist between these. If we start arguing about them in the context of the C standard, we get bogged down into "language lawyerism", which yields no results because trying to convince others that your specific interpretation of the standard text is unlikely to cause others to spend a lot of effort to change their code to conform to your interpretation.
Instead, I say that we accept an imperfect world, and look at the consensus among the kind of C projects we see ourselves in, and conform to that instead. That way, if we fall, we all fall –– and in that case, we just switch to a "better" C compiler (in reality, one that agrees that our consensus is the useful one).
Better yet, knowing the risks lets us talk to the compiler developers, so that if our favourite compiler(s) are veering towards an unfortunate choice (from our perspective), we can inform them, and ask them to gauge the importance of their specific interpretation of the text of the standards, the benefits of the new interpretation, and the benefits of not breaking a lot of existing code. It is a
human decision, not a technical one. Even the standards themselves are developed at this level!
I did not invent any of this, of course, I am just describing what kind of an attitude lets a long-term C developer in all complexity levels (from freestanding environments on microcontrollers to GUI application development using Gtk) solve the conflicts in a rational manner without falling into despair.
When there is no conflict, do trust the C standard; I definitely do.