The C99 standard gives the following definition for undefined behavior:
Behavior, upon use of a nonportable or erroneous program construct or of erroneous data, for which this International Standard imposes no requirements.
If you're working on a project that will never be required to be portable, that is, the compiler and microcontroller won't change, can you safely use nonportable constructs that the International Standard says will result in undefined behavior if they are defined by the compiler or microcontroller you're using?
An implementation is free to define and document some C undefined behaviors.
Rationale document for C99 for example says:
For example, gcc defines some undefined behavior regarding the bitwise shift operator:
http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html