Return делаю. Или вызываю аварийный код, который перезапустит
сбойный модуль. Всего не предусмотришь. Всех сценариев эксплуатации. Поэтому стремлюсь делать функции так, чтобы, по крайней мере, каждая функция в отдельности, при дефекте входных данных, не приводила к вылету указателя или hard fault'у.
И практика показывает, что в не предусмотренной ситуации, код не "падает", а пытается работать в текущих условиях. При этом дефекты в работе оказываются логичными и понятными, ограниченными лишь фактическим сбоем.
Далее, в ключевых местах обработки данных, данные помечаются флагами - недостоверны, так как фиксировались сбои. Но работа продолжается.
Так облегчается поиск даже непредусмотренных неисправностей и сохраняется выполнение не затронутых сбоем функций системы.