I assume you know this but to clarify, it's important to distinguish between tools like fuzzers or UB sanitizers which can detect some cases when UB is triggered under heavy testing, from more sound languages which give you strong assurance against it.
UB in C is a dynamic behaviour, not something that can be detected by static analysis. A lot of it is triggered for example by certain values in passed-in parameters or other implicit state consumed by functions. And flagging any potential UB that might be caused by bad inputs is would yield so many positives that it's unworkable.
See eg "There is No Reliable Way to Determine if a Large Codebase Contains Undefined Behavior" section in http://blog.llvm.org/2011/05/what-every-c-programmer-should-...