К сожалению, нет способа обнаружить все UB. Для этого вам нужно решить проблему остановки.
Лучшее, что вы можете сделать, это знать как можно больше правил, найти их, если у вас есть сомнения, и проконсультироваться с другими программистами (с помощью парного программирования, обзоров кода или просто вопросов SO)
Может помочь компиляция с максимально возможным количеством предупреждений и под несколькими компиляторами. А выполнение кода с помощью инструментов статического анализа, таких как Valgrind, может обнаружить много проблем.
Но, в конечном счете, ни один инструмент не может обнаружить все это.
Дополнительная проблема состоит в том, что многие программы должны полагаться на UB. Некоторые API требуют этого, и просто предполагают, что «это работает на всех вменяемых компиляторах». OpenGL делает это в одном или двух случаях. Win32 API даже не будет компилироваться под совместимый со стандартами компилятор.
Таким образом, даже если бы у вас был магический UB-детектирующий инструмент, он все равно был бы отключен из-за случаев, которые не находятся под вашим контролем.